排序 二 希爾排序,堆排序

2021-10-09 05:33:59 字數 2163 閱讀 6393

1.原理 : 希爾排序法又稱縮小增量法。希爾排序法的基本思想是:先選定乙個整數,把待排序檔案中所有記錄分成個組,所有距離為的記錄分在同一組內,並對每一組內的記錄進行排序。然後,取,重複上述分組和排序的工作。當到達=1時,所有記錄在統一組內排好序。

① 希爾排序是對直接插入排序的優化。

② 當gap > 1時都是預排序,目的是讓陣列更接近於有序。當gap == 1時,陣列已經接近有序的了,這樣就會很快。這樣整體而言,可以達到優化的效果。我們實現後可以進行效能測試的對比。

下圖中顏色相同的數字為同一組,然後對每一組進行插入排序,每次對所有組執行插入結束後,gap = gap/3+1,重新定間隔,重新分組,重複進行插入排序,直到gap = 1,且插入排序執行結束後,排序過程執行結束。

2.實現(公升序):

public

static

void

shellsort

(int

arr)

arr[end + gap]

= key;}}

}

3.效能分析

4.穩定性 : 不穩定

5.評價 : 希爾排序其實是插入排序的公升級版,也是基於插入排序的原理,但是引入了乙個分組的概念,也就是gap,先進行多次預排序,當gap=1時,進行最後一次排序,因為有了之前的預排序過程,所以總體移動次數較少,實現了效能的優化。希爾排序的缺點是不穩定,因為分組和插入的緣故可能導致元素的相對位置發生改變,希爾排序是不穩定排序。

預備知識:——堆是具有以下性質的完全二叉樹:

每個結點的值都大於或等於其左右孩子結點的值,稱為大根堆;

或者每個結點的值都小於或等於其左右孩子結點的值,稱為小根堆。

1.原理 : 堆排序也是選擇排序,只是不在使用遍歷的方式查詢無序區間的最大的數,而是通過堆來選擇無序區間的最大的數。(前提是先了解堆的概念)

堆排序主要分為兩個過程,第乙個是建堆過程,第二是排序過程。

注意 : 排公升序要建大堆;排降序要建小堆。

①建堆 : 圖為建乙個大堆的過程

原陣列 :

大根堆 :

②排序 :

上圖為一次排序的過程,然後按照此過程從最後乙個結點開始依次進行排序,當迴圈至根節點及排序過程結束。

2.實現(公升序) :

/**

* 堆排序

*/public

static

void

heapsort

(int

arr)

//交換 向下調整

//未排序的元素個數

int end = len -1;

while

(end >0)

}/**

*大堆的向下調整

*/public

static

void

shiftdownbig

(int

arr,

int parent,

int sz)

if(arr[child]

> arr[parent]

)else

}}

3.效能分析 :

4.穩定性 : 不穩定

5.評價 : 堆排序是一種常見的排序方式,因為運用了二叉樹,所以堆排序效率提高,時間複雜度為o(n*logn),所以實際應用較多,缺點是由於堆排序有乙個建堆的過程所以當陣列的資料量較小時不能發揮出堆排序的優勢,只有當資料量較大時才能很好的體現出堆排序的優勢之處,我們也經常利用堆排序來解決topk問題。

(若有**不對之處,還請多多指出)

希爾排序,堆排序,快速排序

插入排序的改進演算法,不穩定的排序演算法,空間複雜度為o 1 public static void shellsort int a 氣泡排序的改進演算法,不穩定的排序演算法 空間複雜度在o log2n 和o n 之間 時間複雜度在o n 和o n2 之間,平均時間複雜度為o nlog2n 而當陣列初...

希爾排序,快速排序,堆排序

最近在準備資料結構的考試,於是用部落格記錄下自己複習的過程。今天的內容是三種高階排序。希爾排序 當序列增量為incr k 2 t k 1 1時,時間複雜度為o n1.5 以序列增量分組,對每組進行大小調整。templatevoid shellinsert t elem,int n,int incr ...

希爾排序,堆排序,快速排序

希爾排序 最優情況下 時間複雜度為 o n 1.3 最差的情況下為 o n 2 增量序列的最後乙個增量值必須等於1 shell sort vector v1 堆排序 void heapadjust int a,int m,int n for i n i 1 i 快速排序 快排在樞紐選取時可以優化,三...