1. 程式人生 > >【精華】排序演算法彙總——氣泡排序和快速排序

【精華】排序演算法彙總——氣泡排序和快速排序

日常說明:有錯誤歡迎大家指正。另外本部落格所有的程式碼博主編寫後均除錯通過。重要提醒!!!!博主使用的是VS2017,如果有低版本的小夥伴最好新建空專案將此程式碼複製上去。
更多演算法請關注我的演算法專欄https://blog.csdn.net/column/details/20417.html
有朋友反映讓我多加備註,我覺得除非特別驚豔的方法需要說明外,這些基本的方法是容易明白的,當然前提是先搞懂演算法的基本思想,希望對你們有用。

一、氣泡排序
演算法思想:氣泡排序也成為起泡排序(Bubble Sort),過程很簡單。用氣泡排序的方法將一個數字序列的步驟:第一個關鍵字與第二個關鍵字比較大小,如果第一個關鍵詞大於第二個,那麼交換兩者的位置。較大的關鍵字繼續和之後的關鍵字比較,依次類推,一趟一趟的進行,直到將序列按非遞減排序為止。其實就是每一趟將最大的關鍵詞找出來,類似於水中的氣泡向上漂浮。
如 :
49 38 65 97 76 13 27
第一趟後:38 49 65 76 13 27 97(最大的為97)
第二趟後:38 49 65 13 27 76(最大76)
第三趟後:38 49 13 27 65(最大65)
第四趟:38 13 27 49 (最大49)
第五趟:12 27 38
至此排序完成:12 27 38 49 65 76 97
氣泡排序的時間複雜度O(n^2)
核心程式碼:

for(i=0;i<L.length-1;i++)
{
    if(L[i]<L[i+1])
    {
        swap(L[i]<L[i+1]);    //簡單的交換函式
    }
}

二、快速排序
演算法思想:快速排序是對氣泡排序的一種簡單改進,效率卻大大提高。具體的做法是:
首先確定一個樞軸值,一般是選擇序列的第一個關鍵字。分別從兩端將關鍵詞和樞軸值進行比較,比樞軸值小的放在樞軸值左側,比樞軸值大的放在樞軸值右側。這樣一趟下來就將序列分為兩個子序列,再分別對兩個子序列進行同樣的劃分,直至排序完成。
如:
49 38 65 97 76 13 27
第一次劃分:27 38 13 49

76 65 97
兩個子序列分別進行快速排序:
13 27 38(子序列一趟排序完成)
65 76 97 (排序一趟完成)
即:13 27 38 49 65 76 97
核心程式碼:

int partition(Sqlist&L,int low,int high)
{
    L[0] = L[low];//L[0]用來儲存樞軸值,即將第一個關鍵字L[low]賦值給L[0]
    key = L[low];//樞軸關鍵字
    while(low<high)
    {
        while(low<high&&L[high]>=key)
        {--high};
        L[low] = L[high];
        while
(low<high&&L[low]<=key) {++low}; L[high]=L[low]; } L[low]=L[high]; return low; } int Qsort(Sqlist&L,int low,int high) { if(low<high) { temp = partition(L,low,high); Qsort(L,low,temp-1); Qsort(L,temp+1,high); } }