排序算法——冒泡算法及其优化
所谓冒泡算法,就是第一个跟第二个比,第二个跟第三个比。。。,首先从第一个树比到最后一个数,如果第一个比第二个大,那么一二互换,如果二三比,二大,二三再互换,如此下去,最大的数就会排到最后面,然后就是再从第一个数比到倒数第二个,重复上面的动作
现在我们看一下代码
[22:54:16] vi bublle_1.c [22:54:28] gcc bublle_1.c [22:54:32] ./a.out 1 2 3 4 5 6 7 8 9 10 [22:54:33] cat bublle_1.c #include<stdio.h> int main() { int i,j,t,a[]={3,1,5,7,2,4,9,6,10,8}; int len=sizeof(a)/sizeof(a[0]); for(i=0;i<len;i++) for(j=0;j<=len-i-1;j++) { if(a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } for(i=0;i<len;i++) printf("%d ",a[i]); printf("\n"); return 0; } [22:54:36]
现在我们来优化一下算法。这里我们使用一个pos用来记录最后一个交换的位置,你试想一下,如果我们现在比到第五个数了,然后我们现在就用pos记住4,继续再比下去,如果要使pos不变,是不是意味这后面的数都是前一个比后一个大(或者小),也就是说pos后面的序列已经有序了
[23:29:50] gcc bublle_2.c [23:29:53] ./a.out 1 2 3 4 5 6 7 8 9 10 [23:29:55] cat bublle_2.c #include<stdio.h> int main() { int i,j,t,a[]={3,1,5,7,2,4,9,6,10,8}; int len=sizeof(a)/sizeof(a[0]); int pos=len; for(i=0;i<pos;i++) { for(j=0;j<len-i-1;j++) { if(a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; pos=j; } } } for(i=0;i<len;i++) printf("%d ",a[i]); printf("\n"); return 0; } [23:29:59]
其实冒泡排序还可以再优化。我们可以同时排最大和最小值
[23:48:42] gcc bublle_3.c [23:48:47] ./a.out 1 2 3 4 5 6 7 8 9 10 [23:48:49] cat bublle_3.c #include<stdio.h> int main() { int i,t,a[]={3,1,5,7,2,4,9,6,10,8}; int len=sizeof(a)/sizeof(a[0]),low,high; low=0; high=len-1; while(low<high) { for(i=low;i<high;i++)//把最大值放到后面 if(a[i]>a[i+1]) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } high--;//最大的值排好好,high-1 for(i=low;i<high;i++) if(a[i]>a[i+1]) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } low++; } for(i=0;i<len;i++) printf("%d ",a[i]); printf("\n"); return 0; } [23:48:53]