資料結構8 排序2

2021-07-10 16:52:07 字數 1729 閱讀 4519

快速排序法是目前公認的最佳排序法,他的原理和氣泡排序法一樣都是利用交換的方式,不過它會先在資料中找到乙個值稱為支點,把小於支點的資料放在左邊,而大於支點的資料放在右邊,再以同樣的方式處理左右兩邊資料,直到完成為止。

步驟如下:

對於鍵值集合k1,k2........kn,快速排序步驟如下:

1)取k為第乙個鍵值(支點);

2)由左向右找出乙個鍵值ki,使得ki>k;

3)由右向左找出乙個鍵值kj,使得kj

4)若i

5)如果i>j,則k與kj呼喚,以j為基準點將資料分為左右兩個部分。在以遞迴的方式分別為左右兩邊進行排序,直至完成排序。

原理圖:

堆排序法可以算是選擇排序法的改進版,他可以減少在選擇排序法中的比較次數,進而減少排序的時間。堆排序法利用二叉堆完成排序。二叉堆是一種特殊的二叉樹,可分為最大堆和最小堆。

最大堆:

1)它是一棵完全二叉樹;

2)所有結點的值都大於或等於它的左右子結點的值;

3)樹根的值是樹中最大的。

最小堆:

1)它是一棵完全二叉樹;

2)所有結點的值都小於或等於它的左右子結點的值;

3)樹根的值是樹中最小的。

二叉樹轉換成二叉堆:

就是將整個樹種的子結點值與父結點進行對比,如果大於(小於)則調換,這樣父結點就可以使最大(最小)值。從而變成最大堆或者最小堆。

原理圖:

用二叉堆來進行排序:

1)每乙個二叉堆的樹根都是最大(最小)值;

2)移除樹根,將該值存入鍊錶;

3)對於這個不完全的樹,重新建立最大(最小)二叉堆;

4)重複步驟2;

5)完成陣列的從大到小或者從小到大的排序。

特性:1)所有情況下時間複雜度均為o(nlog2n) ; //2表示以2為底

2)堆排序法不是穩定排序法;

3)只需要乙個額外空間,空間複雜度為o(1)。

基數排序法又稱為桶排序法,和之前所討論的排序演算法不同,他並不需要進行元素間的比較操作,而是屬於一種分配排序方式。

基數排序法的比較方向可以分為最高優先msd和最低位優先lsd兩種。msd法是從最左邊的位數開始比較,而lsd則是從最右邊的位數開始比較。

簡而言之,就是

1)把每個整數按照個位數字放在鍊錶中;

2)按照十位數字放在鍊錶中,並將不含有十位數字的放在一起進行一次排序;

3)按照百位數字放入鍊錶中,將不含有百位數字放在一起進行一次排序。

特性:1)所有情況下,時間複雜度均為o(nlogp k),其中p為底數,表示資料的位數,k表示原始資料的最大值;

2)基數排序法是穩定排序法;

3)基數排序法會使用到很大的額外空間來存放序列資料,其空間複雜度為o(n*p),其中n是原始資料的個數,p是資料的位數;

4)若n很大,p固定或者很小時候,此排序法擁有很高的效率。

當所有的排序資料太多或者檔案太大時候,無法直接在記憶體中進行排序,則需要依賴外部儲存裝置時,就會使用到外部排序法。外部儲存裝置可以按照訪問的方式分為兩種:順序訪問或者隨機訪問。

1)將待排序的資料檔案分成幾個小部分檔案,然後對各個小檔案進行內部排序;

2)合併小檔案,兩兩合併之後把所有檔案合併成乙個檔案即可。

資料結構 2 排序演算法

常見的排序演算法 氣泡排序 選擇排序 插入排序 歸併排序 快速排序 堆排序 includeusing namespace std void swap int a,int i,int j 冒泡法 平均時間複雜度 o n 2 void bubblosort int a,int n void bubblo...

資料結構1 排序

就算複習再緊張,也要動手實踐資料結構中的基本演算法,徹底理解演算法的本質。不要讓任何理由成為不程式設計的藉口。從快速排序開始,將演算法問題一一攻克。複習提綱 基本資料結構 棧和佇列,陣列和鍊錶 樹和二叉樹 二叉查詢樹 平衡二叉樹 雜湊表 排序演算法 選擇排序 氣泡排序和快速排序 堆和堆排序 計數排序...

資料結構 07 排序

簡單的排序方法 氣泡排序 選擇排序 插入排序 希爾排序。先進的排序方法 歸併排序 快速排序 堆排序 基數排序。1.演算法思想 每次在未排序的元素中兩兩比較找最大值,邊找邊從後往前儲存 未排序.第i大 第2大 第1大 一般情況,整個氣泡排序只需進行 k 1 k氣泡排序結束的條件是 在某一趟排序過程中沒...