冒泡排序(C语言)-解析
排序算法是一种重要的、基本的算法。排序的方法有很多,在这里给大家讲解一下“冒泡法排序”。
“冒泡排序”的基本思路是:每次将相邻两个数比较,将小的调到前头(本例默认是按递增排列)。
若有6个数:9,8,5,4,2,0。
第一次先将最前面的两个数 8 和 9 对调(见图1)。
第 2 次将第 2 和第 3 个数( 9 和 5)对换……如此共进行5次,
得到 8 - 5 - 4 - 2 - 0 - 9的顺序。
可以看出:最大的数 9 已经“沉底”,成为最下面一个数,而小的数则“上升”。最小的数 0 已向上“浮起”一个位置。经过第一趟(共计5次比较与交换)后,
已得到最大的数9。
然后进行第 2 趟比较,对余下的前面 5 个数(8,5,4,2,0)进行新一轮的比较,
以便使次大的数“沉底”。按以上方法进行第 2 趟比较,见图2。
经过这一趟 4 次比较与交换,得到次大的数 8。
按此规律进行下去,可以推出,对 6 个数要比较 5 趟,才能使 6 个数大小顺序排列。
在第一趟中要进行两个数之间的比较共 5 次,在第 2 趟过程中比较 4 次……
第 5 趟只需比较 1 次。
由此推出,如果有 n 个数,则要进行 n - 1 趟比较。在第一趟比较中要进行 n - 1 次两两比较,在第 j 趟比较中要进行 n - j 次两两比较。
再次分析排序的过程,原来 0 是最后一个数,经过第 1 趟比较与交换,0 上升为第 5 个数(最后第 2 个数)。再经过第 2 趟比较与交换,
0 上升为第 4 个数(最后第 3 个数)。再经过第 3 趟比较与交换,0 上升为第 3 个数……每经过一趟的比较与交换,最小的数“上升”一位,
最后升到第一个数。这如同水底的气泡逐步冒出水面一样,故称为“冒泡法”,或“起泡法”。
据此画出流程图(图3)(假设n = 10)
代码(c语言):
1 #include<stdio.h> 2 int main() 3 { 4 int a[10]; 5 int i,j,t; 6 printf("input 10 numbers :\n");//输入 7 for(i = 0;i < 10; i++) //数组 8 scanf("%d",&a[i]); //a[0]~a[9] 9 printf("\n"); 10 for(j = 0; j < 9; j++) 11 for(i = 0;i < 9-j; i++) //冒泡排序 12 if(a[i] > a[i+1]) //核心算法 13 { 14 t = a[i]; 15 a[i] = a[i+1]; 16 a[i+1] = t; 17 } 18 printf("the sorted numbers :\n"); 19 for(i = 0;i < 10; i++) //输出 20 printf("%d ",a[i]); //数组 21 printf("\n"); 22 return 0; 23 }
输出/输出结果:
上述起泡排序的最坏情况是数组 a 的初态为降序,在此最坏情况下的素颜发时间复杂度为 T(n) = O(n^2)。
一般情况下,除特别指明外,算法的时间复杂度均指最坏情况下的时间复杂度。