7種排序演算法總結

2021-10-16 20:24:51 字數 4080 閱讀 2421

整理的時候資源來自網路。不妥的聯絡我。謝謝。

事實上,目前還沒有十全十美的排序演算法,有優點就會有缺點,即使是快速排序法,也只是在整體效能上優越,它也存在排序不穩定、需要大量輔助空間、對少量資料排序無優勢等不足。因此我們就來從多個角度來剖析一下提到的各種排序的長與短。

我們將7種演算法的各種指標進行對比,如表9‐10‐1所示。

表9‐10‐1

排序方法平均情況最好情況最壞情況輔助空間穩定性

氣泡排序    o(n2o(no(n2)   o(1) 穩定

簡單選擇排序  o(n2o(n2)    o(n2)      o(1)    穩定

直接插入排序  o(n2o(n)     o(n2)   o(1) 穩定

希爾排序    o(nlogn)-o(n2o(n1.3o(n2)   o(1)    不穩定

堆排序     o(nlogno(nlogno(nlogn)   o(1)   不穩定

歸併排序    o(nlogno(nlogno(nlogn)   o(n)   穩定

快速排序    o(nlogno(nlogno(n2) o(logn)~o(n) 不穩定

從演算法的簡單性來看,我們將7種演算法分為兩類:

簡單演算法:冒泡、簡單選擇、直接插入。

改進演算法:希爾、堆、並、快速。

從平均情況來看,顯然最後3種改進演算法要勝過希爾排序,並遠遠勝過前3種簡單演算法。

從最好情況看,反而冒泡和直接插入排序要更勝一籌,也就是說,如果你的待排序序列總是基本有序,反而不應該考慮後4種複雜的改進演算法。

從最壞情況看,堆排序與歸併排序又強過快速排序以及其他簡單排序。

從這三組時間複雜度的資料對比中,我們可以得出這樣乙個認識。堆排序和歸併排序就像兩個參加奧數考試的優等生,心理素質強,發揮穩定。而快速排序像是很情緒化的天才,心情好時表現極佳,碰到較糟糕環境會變得差強人意。

但是他們如果都來比賽計算個位數的加減法,它們反而算不過成績極普通的冒泡和直接插入。

從空間複雜度來說,歸併排序強調要馬跑得快,就得給馬吃個飽。快速排序也有相應的空間要求,反而堆排序等卻都是少量索取,大量付出,對空間要求是o(1)。如果執行演算法的軟體所處的環境非常在乎記憶體使用量的多少時,選擇歸併排序和快速排序就不是乙個較好的決策了。

從穩定性來看,歸併排序獨占鰲頭,我們前面也說過,對於非常在乎排序穩定性的應用中,歸併排序是個好演算法。

從待排序記錄的個數上來說,待排序的個數n越小,採用簡單排序方法越合適。反之,n越大,採用改進排序方法越合適。這也就是我們為什麼對快速排序優化時,增加了乙個閥值,低於閥值時換作直接插入排序的原因。

從表9‐10‐1的資料中,似乎簡單選擇排序在3種簡單排序中效能最差,其實也不完全是,比如,如果記錄的關鍵字本身資訊量比較大(例如,關鍵字都是數十位的數字),此時表明其占用儲存空間很大,這樣移動記錄所花費的時間也就越多,我們給出3種簡單排序演算法的移動次數比較,如表9‐10‐2所示。

表9-10-2

排序方法平均情況最好情況最壞情況

氣泡排序    o(n2)    0     o(n2)

簡單選擇排序  o(n)     0     o(n)

直接插入排序  o(n2)    o(n)    o(n2)

你會發現,此時簡單選擇排序就變得非常有優勢,原因也就在於,它是通過大量比較後選擇明確記錄進行移動,有的放矢。因此對於資料量不是很大而記錄的關鍵字資訊量較大的排序要求,簡單排序演算法是佔優的。另外,記錄的關鍵字資訊量大小對那四個改進演算法影響不大。

總之,從綜合各項指標來說,經過優化的快速排序是效能最好的排序演算法,但是不同的場合我們也應該考慮使用不同的演算法來應對它。

一、 氣泡排序:

原理:將序列劃分為無序和有序區,不斷通過交換較大元素至無序區尾完成排序。

要點:設計交換判斷條件,提前結束以排好序的序列迴圈。

二、 簡單選擇排序:

原理:將序列劃分為無序和有序區,尋找無序區中的最小值和無序區的首元素交換,使得有序區擴大乙個,迴圈最終完成全部排序。

三、直接插入排序:

原理:將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。

要點:設立哨兵,作為臨時儲存和判斷陣列邊界之用。

四、希爾排序:

原理:又稱增量縮小排序。先將序列按增量劃分為元素個數相同的若干組,使用直接插入排序法進行排序,然後不斷縮小增量直至為1,最後使用直接插入排序完成排序。

要點:增量的選擇以及排序最終以1為增量進行排序結束。

五、堆排序:

原理:利用大根堆或小根堆思想,首先建立堆,然後將堆首與堆尾交換,堆尾之後為有序區。

要點:建堆、交換、調整堆

六、歸併排序:

原理:將原序列劃分為有序的兩個序列,然後利用歸併演算法進行合併,合併之後即為有序序列。

要點:歸併、分治

七、快速排序:

原理:快速排序採用了一種分治的策略,通常稱其為分治法,其基本思想是:將原問題分解為若干個規模更小但結構與原問題相似的子問題。

遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。

快速排序的具體過程如下:

第一步,在待排序的n個記錄中任取乙個記錄,以該記錄的排序碼為準,將所有記錄分成兩組,第1組各記錄的排序碼都小於等於該排序碼,第2組各記錄的排序碼都大於該排序碼,並把該記錄排在這兩組中間。

第二步,採用同樣的方法,對左邊的組和右邊的組進行排序,直到所有記錄都排到相應的位置為止。

自己測試用到的main()函式:

int main(void)

printf("\nafter sort :\n");

b = (int*)malloc(sizeof(int)*num);

for(i=0;i<7;i++)

printf("\n");

}free(b);

}由於本人基礎較差,整理的時候難免有問題,麻煩各位把看到的問題貼出來,共同學習學習,謝謝了。

1氣泡排序:

原理:將序列劃分為無序和有序區,不斷通過交換較大元素至無序區尾完成排序。

要點:設計交換判斷條件,提前結束以排好序的序列迴圈。

實現:int bubblesort(int l,int length)

}if(ischanged == 0)//若沒有移動則說明序列已經有序,直接跳出

break;

}return 0;

}三、 簡單選擇排序:

原理:將序列劃分為無序和有序區,尋找無序區中的最小值和無序區的首元素交換,使得有序區擴大乙個,迴圈最終完成全部排序。

實現:voidselectsort(int l,int length)

if(k!=i)//若發現最小元素,則移動到有序區}}

三、直接插入排序:

原理:將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。

要點:設立哨兵,作為臨時儲存和判斷陣列邊界之用。

實現:int insertsort(int l,int length)

l[++i] = temp;//將儲存的元素資料插入到相應位置

i = j - 1;// 還原外部迴圈的下標

}}return 0;

}四、希爾排序:

原理:又稱增量縮小排序。先將序列按增量劃分為元素個數相同的若干組,使用直接插入排序法進行排序,然後不斷縮小增量直至為1,最後使用直接插入排序完成排序。

要點:增量的選擇以及排序最終以1為增量進行排序結束。

實現:void shellsort(int l,int length)

l[j+d] = temp;

}d >>= 1;

}五、堆排序:

原理:利用大根堆或小根堆思想,首先建立堆,然後將堆首與堆尾交換,堆尾之後為有序區。

要點:建堆、交換、調整堆

實現:int max_heapify(int a,int i,int length)

return 0;

}int build_heap(int a,int length)

{ int i;

//size = sizeof(a)/sizeof(int);

for(i = (length-1)/2;i>=0;i--)

max_heapify(a,i,length);

return 0;

排序演算法總結

常見的排序方式有6種 簡單排序裡面的有 插入排序 選擇排序 氣泡排序,時間複雜度為o n 2 線性對數階的排序 歸併排序 merge sort 快速排序,堆排序,時間複雜度為o nlogn 在n 50的情況下,最好使用插入排序或者選擇排序,由於選擇排序移動次數比插入排序少,在資料量比較多的情況,推薦...

排序演算法總結

按平均時間將排序分為四類 1 平方階 o n2 排序 一般稱為簡單排序,例如直接插入 直接選擇和氣泡排序 2 線性對數階 o nlgn 排序 如快速 堆和歸併排序 3 o n1 階排序 是介於0和1之間的常數,即0 1,如希爾排序 4 線性階 o n 排序 如桶 箱和基數排序。各種排序方法比較 簡單...

排序演算法總結

熱2已有 2573 次閱讀 2009 09 01 13 23 填問卷贏好書華章讀者調研活動結果公布 一 選擇排序 1.基本思想 每一趟從待排序的資料元素中選出最小 或最大 的乙個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。2.排序過程 示例 初始關鍵字 49 38 65 97 ...