冒泡排序
數據結構 | 數組 |
---|---|
最差時間復雜度 | O(n^2) |
最優時間復雜度 | O(n) |
平均時間復雜度 | O(n^2) |
最差空間復雜度 | 總共O(n),需要輔助空間O(1) |
1、算法思想
- 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。這步做完后,最后的元素會是最大的數。
- 針對所有的元素重復以上的步驟,除了最后一個。
- 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
2、偽代碼
function bubble_sort (array, length) { var i, j; for(i from 0 to length-1){ for(j from 0 to length-1-i){ if (array[j] > array[j+1]) swap(array[j], array[j+1]) } } }
3、實現
#include <stdio.h> void bubble_sort(int arr[], int len) { int i, j, temp; for (i = 0; i < len - 1; i++) for (j = 0; j < len - 1 - i; j++) if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } int main() { int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 }; int len = (int) sizeof(arr) / sizeof(*arr); bubble_sort(arr, len); int i; for (i = 0; i < len; i++) printf("%d ", arr[i]); return 0; }
4、改進
(1)設置一個標志,如果這一趟發生了交換,則為true,否則為false。明顯如果有一趟沒有發生交換,說明排序已經完成。
偽代碼:參考 http://visualgo.net/sorting
do swapped = false for i = 1 to indexOfLastUnsortedElement if leftElement > rightElement swap(leftElement, rightElement) swapped = true while swapped
實現:參考 http://www.cnblogs.com/morewindows/archive/2011/08/06/2129603.html
void BubbleSort2(int a[], int n) { int j, k; bool flag; k = n; flag = true; while (flag) { flag = false; for (j = 1; j < k; j++) if (a[j - 1] > a[j]) { Swap(a[j - 1], a[j]); flag = true; } k--; } }
(2)如果有100個數的數組,僅前面10個無序,后面90個都已排好序且都大於前面10個數字,那么在第一趟遍歷后,最后發生交換的位置必定小於10,且這個位置之后的數據必定已經有序了,記錄下這位置,第二次只要從數組頭部遍歷到這個位置就可以了。
http://www.cnblogs.com/morewindows/archive/2011/08/06/2129603.html
實現:
void BubbleSort3(int a[], int n) { int j, k; int flag; flag = n; while (flag > 0) { k = flag; flag = 0; for (j = 1; j < k; j++) if (a[j - 1] > a[j]) { Swap(a[j - 1], a[j]); flag = j; } } }