冒泡排序

94 阅读2分钟

冒泡排序 起泡排序,别名“冒泡排序”,该算法的核心思想是将无序表中的所有记录,通过两两比较关键字,得出升序序列或者降序序列。

例如,对无序表{49,38,65,97,76,13,27,49}进行升序排序的具体实现过程如图 1 所示:

通过一趟趟的比较,一个个的“最大值”被找到并移动到相应位置,直到检测到表中数据已经有序,或者比较次数等同于表中含有记录的个数,排序结束,这就是起泡排序。

冒泡排序代码实现

#include <stdlib.h> #include <stdio.h>

// 采用两层循环实现的方法。 // 参数arr是待排序数组的首地址,len是数组元素的个数。 void swap1(int* a,int* b){ int c = *a; *a = *b; *b = c; } void bubblesort1(int *arr,unsigned int len) { if(len < 2) return; for(int i = len-1;i>0;i--){ for (int j = 0; j < i; ++j) { if(arr[j]>arr[j+1]){ swap1(&(arr[j]),&(arr[j+1])); } } } }// 采用递归实现的方法。 // 参数arr是待排序数组的首地址,len是数组元素的个数。 void bubblesort2(int *arr,unsigned int len) { if(len < 2) return ; for(int i = 0;i<len - 1;i++){ if(arr[i]>arr[i+1]){ swap1(&(arr[i]),&(arr[i+1])); } } bubblesort2(arr,--len); }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 观察上面的冒泡排序算法可知,通过么len - 1趟排序完成,每一趟排序将排好一个数,当排到一定程度时,序列已经有序的情况下,还会完成对有序序列的排序。

冒泡排序算法的优化

#include <stdlib.h> #include <stdio.h>

// 采用两层循环实现的方法。 // 参数arr是待排序数组的首地址,len是数组元素的个数。 void swap1(int* a,int* b){ int c = *a; *a = *b; *b = c; } void bubblesort1(int *arr,unsigned int len) { int swap ; if(len < 2) return ; for(int i = len - 1;i>0;i--){ swap = 0; for(int j = 0;j < i;j++) { if (arr[j] > arr[j + 1]){ swap1(&(arr[j]), &(arr[j + 1])); swap = 1; } } printf("i = %d\n",i); if(swap == 0) return ; } }

// 采用递归实现的方法。 // 参数arr是待排序数组的首地址,len是数组元素的个数。 void bubblesort2(int *arr,unsigned int len) { if(len < 2) return ; int tmp = 0; for(int i = 0;i<len - 1;i++){ if(arr[i]>arr[i+1]){ swap1(&(arr[i]),&(arr[i+1])); tmp = 1; } } if(tmp == 0) return ; printf("len = %d\n",len); bubblesort2(arr,--len);

}

原文链接:blog.csdn.net/weixin_5980…