複習資料結構:排序演算法(二)——冒泡排序,資料結構冒泡

來源:互聯網
上載者:User

複習資料結構:排序演算法(二)——冒泡排序,資料結構冒泡

    

    這篇複習冒泡排序。

    冒泡排序也是一種穩定排序、內排序。
    冒泡排序的基本思想:對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。
插入排序比冒泡排序快!


    上面說的是普通的冒泡排序演算法,時間複雜度是O(n^2),這種方法只能一趟排序操作只能找到一個最大值或最小值,消耗時間太多。

    改進方法1:我們可以讓每趟排序中進行正向和反向兩遍冒泡的方法,一次就可以同時得到最大值和最小值,這樣一來排序的趟數減少了一半。這種方法形象來說就像振蕩小球,如果兩端已經選擇出來最大值和最小值,那麼下一趟排序的時候就會縮小排序的距離,後面振蕩的幅度就會減小,一直當幅度為0,是不是很像振蕩小球由於阻尼的存在,不斷減少幅度,直至停止。

    改進方法2:在每趟排序過程中,用標記位記錄每趟排序中最後一次交換的位置,如果最後一次交換的位置在0,那麼就說明整個數組排序完畢。這種改進的思想是把先前排序的先驗資訊使用上,減少排序的次數。


    實現代碼:

#include<iostream>using namespace std; void BubbleSort(int a[], int n){for(int i = 0; i < n-1; i++){for(int j = 0; j < n-i-1; j++){if(a[j] > a[j+1])swap(a[j], a[j+1]); }}}void BubbleSort_2(int a[], int n){int low = 0; int high = n-1; int j; while(low < high){for(j = low; j < high; j++){if(a[j] > a[j+1])swap(a[j], a[j+1]); }high--; for(j = high; j > low; j--){if(a[j] < a[j-1])swap(a[j], a[j-1]); }low++; }}void BubbleSort_3(int a[], int n){int i = n-1;  // 初始時的最後交換位置while(i > 0)  //  直到交換位置為0{int pos = 0; for(int j = 0; j < i; j++)  // 每趟排序只進行到上次最後交換的位置{if(a[j] > a[j+1]){pos = j; swap(a[j], a[j+1]);}}i = pos; }}int main(){int a[] = {1, 4, 8, 6, 2, 7}; BubbleSort_3(a, 6); for(int i = 0; i< 6; i++)cout<<a[i]<<' '; cout<<endl; return 0; }




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.