一、概念:
冒泡排序,是对桶排序改进的一种排序,不仅解决了浪费空间的问题,而且还可以进行浮点数的比较和输出一些必要的信息,容易实现由小到大(由大到小)的一种排序方法。
二、算法思路:
1、每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来;
2、用两层for循环进行比较:1>外层循环控制轮数;
2>内层循环实现数的两两比较。
说明:如果有N个数,则要进行N-1轮比较。在第一轮比较中要进行N-1次两两比较,在第j轮比较中进行N-j次两两比较。
三、图解:
说明:用冒泡排序实现下面5个数由大到小排序。
原始数据:
34 67 90 43 124
第一轮:
124 | 124 | 124 | 124 | 34
43 | 43 | 43 | 34 | 124
90 | 90 | 34 | 43 | 43
67 | 34 | 90 | 90 | 90
34 | 67 | 67 | 67 | 67
解析:
1、形象直观地看出,最小的数在这一轮的比较中不断上升一位,直到升到最后一位。就如同是一个气泡,一步一步往后“翻滚”,直到最后一位。所以这个排序的方法有一个很好听的名字“冒泡排序”。
2、在这一轮中进行了4次两两比较(N-1次比较)。
第一轮排序后: 67 90 43 124 34
在接下来的几轮的比较中与第一轮的比较方法相同
第二轮排序后: 90 67 124 43 34
第三轮排序后: 90 124 67 43 34
第四轮排序后: 124 90 67 43 34
四、代码实现:
#include <stdio.h> # define N 5 void print_arry(int *a,int len) { int i; for(i = 0;i < len;i++) { printf("%d ",*(a+i)); } printf("\n"); } void bubble_sort(int *a,int len) { int i,j,n,temp; for(i = 0;i < len-1;i++) { for(j = 0;j < len-1-i;j++) { if(a[j] < a[j+1]) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } for(n = 0;n < len;n++) //打印排序过程 { printf("%d ",a[n]); } printf("\n"); getch(); } } int main() { int a[N] = {34,67,90,43,124}; int i; printf("原数组\n"); print_arry(a,sizeof(a)/sizeof(a[0])); printf("排序过程\n"); bubble_sort(a,sizeof(a)/sizeof(a[0])); printf("排序后\n"); print_arry(a,sizeof(a)/sizeof(a[0])); return 0; }
五、复杂度:
时间复杂度:O(n² ),最好的情况下是O(n );
空间复杂度:O(1)。