数据结构排序之冒泡和选择
原创
©著作权归作者所有:来自51CTO博客作者vaynedu的原创作品,请联系作者获取转载授权,否则将追究法律责任
现在在博客写冒泡排序和选择排序,我都认为自己有点脑残了
,还是写写吧,我主要是想把排序好好整理一下,在自己最后复习查看的时候可以方便一点,就算忘记了,扫一下也就一目了然了,反正我不要手高眼低就可以了,难得不会就不会,但是简单的我绝对不能出错,作为一个程序猿就应该报这种态度好好撸代码。
先是选择排序吧,程序猿都懂,就是每次拿出一个数,然后和剩下的数进行比较,如果这个数比和它相比的数小的话,就进行交换(我说的顺序都是从小到大),在最坏的情况下,比较次数永远是n(n-1)/2,但是这个时间复杂度o(n^2)下面是一个完整代码,
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void choosesort(int array[],int n) // 实现选择排序的函数
{
int i,j,t;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(array[i]>array[j])
{
t=array[i];
array[i]=array[j];
array[j]=t;
}
}
int main() // 主函数
{
int array[100];
int i=0,n;
srand ( (unsigned)time (NULL) );
printf("请你输入要排序的个数: ");
scanf("%d",&n);
printf("随机产生%d个数: ",n);
for(i=0;i<n;i++)
{
array[i]=rand()%10+10; //产生10~20之间的数
printf("%d ",array[i]);
}
choosesort(array,n); // 实现排序的函数
printf("\n排序之后为:",n);
for(i=0;i<n;i++)
{
printf("%d ",array[i]);
}
printf("\n");
return 0;
}
这一种选择排序还可以优化代码,就是遇到相同的时候,这种情况就不处理了,让程序继续进行,其实只要多用一个K变量,k=i,用k标记最小数的下标,然后进行if(k!=i)看k和i是否相等,不相等就证明找到了一个最小值,然后进行交换
void choosesort(int array[],int n) // 实现选择排序的函数
{
int i,j,t,k;
for(i=0;i<n-1;i++)
{
k=i;//用k标记i
for(j=i+1;j<n;j++)
{
if(array[k]>array[j])
k=j;//记录最小数的坐标
{
t=array[i];
array[i]=array[k];
array[k]=t;
}
}
}
下面就是冒泡排序了,冒泡排序其实复杂度挺高的,最坏的情况下,时间复杂度o(n^2),两两比较时,一旦发现后面的元素比前面的小,就进行交换,然后进入下一次的循环,利用交换过的在和下一个比较,每进行一次第一层的for循环,冒泡排序就要沉淀一个元素,即就是沉底,
void maopaosort(int array[],int n) // 实现排序的函数
{
int i,j,t;
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
if(array[i]<array[j])
{
t=array[i];
array[i]=array[j];
array[j]=t;
}
}
}