標籤:冒泡排序 改進 排序
排序過程:
將第一個記錄的關鍵字與第二個記錄的關鍵字進行比較,若為逆序r[1].key > r[2].key,則交換;然後比較第二個記錄與第三個記錄;依次類推,直至第n - 1個記錄和第n個記錄比較為止,第一趟冒泡排序,結果關鍵字最大的記錄被安置在最後一個記錄上。
對前n - 1個記錄進行第二趟冒泡排序,結果使關鍵字次大的記錄被安置在第n - 1個記錄位置。
重複上述過程,直到“在一趟排序過程中沒有進行過交換記錄的操作”為止。
時間複雜度O(n^2)
簡單版:
#include <iostream>#include <cstdio>#include <ctime>#include <iomanip>using namespace std;int arr[10000];void mySwap(int &a, int &b){int t = a;a = b;b = t;}void bubbleSort(int *a, int len){bool alreadySort = false; // 記錄如果已經排序完成,可以提前退出for (int i = len - 1; i >= 0 && !alreadySort; i--) { // 從後往前排序alreadySort = true;for (int j = 0; j < i; j++) {if (a[j] > a[j + 1]) {mySwap(a[j], a[j + 1]);alreadySort = false;}}}}void printArray(int *a, int len){for (int i = 0; i < len; i++) {if (i != 0 && i % 10 == 0) {cout << endl;}cout << setw(3) << a[i] << ' ';}cout << endl;}int main(){srand(time(0));cout << "Please input length of array: ";int len;cin >> len;for (int i = 0; i < len; i++) {arr[i] = rand() % 100;}cout << "Before sorting:\n";printArray(arr, len);bubbleSort(arr, len);cout << "After sorting:\n";printArray(arr, len);return 0;}/*Please input length of array: 20Before sorting:70 53 65 69 99 67 36 49 66 1658 73 65 20 75 30 93 8 42 57After sorting:8 16 20 30 36 42 49 53 57 5865 65 66 67 69 70 73 75 93 99*/
改進:記住最後一次交換髮生的位置lastExchange,下一趟排序開始時,R[1...lastExchange]是無序區,R[lastExchange...n]是有序區。這樣一趟排序可能使當前有序區擴充多個記錄,從而減少排序的趟數。
只需改進bublleSort函數:
void bubbleSort(int *a, int len){bool alreadySort = false; // 記錄如果已經排序完成,可以提前退出for (int i = len - 1; i >= 0 && !alreadySort;) { // 從後往前排序alreadySort = true;int lastExchange = i; // 記住最後一次交換的位置,可以減少排序趟數for (int j = 0; j < i; j++) {if (a[j] > a[j + 1]) {mySwap(a[j], a[j + 1]);alreadySort = false;lastExchange = j;}}i = (lastExchange < i ? lastExchange : i - 1);}}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
排序 - 冒泡法(改進)