冒泡排序
初稿:2017-11-19 19:53:08
最坏时间复杂度:O(n^2)每一趟都发生交换,持续了array.len-1趟,每一趟的每个单元都发生交换。
最佳时间复杂度:O(n) 原数组是有序数组或基本有序,只扫描一趟。
平均时间复杂度是O(n^2)
稳定性:稳定
一次性放到终态位置: 是
适用:大致有序的少量数据
核心知识点:
- 两层循环
for(i = len - 2; i >= 0; --i) {
for(j = 0; j <= i; ++i) {
}
}
- 标志位
当某一趟没发生交换,说明数组已经有序,可终止排序,避免后面无谓的扫描。
#include"头文件.h" void BubbleSort(int *a,int len) { if (a == null || len < 1) return; int i, j,temp; bool flag;//标志位,可以提前结束循环 for (i = len - 2; i >= 0; --i) { flag = 0; for (j = 0; j <= i; ++j) { if (a[j] > a[j + 1]) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; flag = 1; } } if (flag == 0)//flag == 0,说明本趟没发生交换 return; } } int main() { int a[100]; for (int i = 0; i < 100; ++i) { a[i] = 1 + rand() % 100; } printf("排序前的数组:\n"); for (int i = 0; i < 100; ++i) { printf("%4d ", a[i]); if ((i + 1) % 10 == 0) printf("\n"); } printf("\n"); printf("排序后的数组:\n"); BubbleSort(a, 100); for (int i = 0; i < 100; ++i) { printf("%4d ", a[i]); if ((i+1) % 10 == 0) printf("\n"); } printf("\n"); system("pause"); return 0; }