排序 - 冒泡法(改進)

來源:互聯網
上載者:User

標籤:冒泡排序   改進   排序   

排序過程:

將第一個記錄的關鍵字與第二個記錄的關鍵字進行比較,若為逆序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);}}

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

排序 - 冒泡法(改進)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.