八大排序演算法 中 希爾 堆排序

2021-08-20 03:31:24 字數 1846 閱讀 4868

上一章提到過的氣泡排序、簡單選擇排序和直接插入排序時間複雜度都是o(n^2);希爾排序是第一批突破這個時間複雜度的演算法之一。

直接插入排序在某些情況下效率是很高的,比如資料基本有序的情苦下,為什麼?如果序列是:;這個序列如果使用直接插入排序的話,由於序列中最大的記錄9位於序列的第一位,因此後面的記錄都需要插入到9之前(假設為從小到大排序),這樣就會造成比較大的時間開銷。但是如果序列是這樣基本有序的,時間效能就會好很多。注意基本有序這個概念,不要求序列一定是從小到大排好的,但是需要小的關鍵字在前面,大的在後面,不大不小的在中間。還有一種情況直接插入排序效率也是比較高的,就是記錄數比較少的時候,直接插入排序優勢也比較明顯。其實記錄數比較少的時候排序演算法之間的差距也並不明顯。

希爾排序是科學家希爾在2023年提出的,採用跳躍分割的策略將待排序的序列分割為若干個子串行,然後對這些子串行進行排序,為什麼要採取跳躍分割而不是直接將每幾位作為乙個子串行的呢?這樣是為了使得排序後的序列是基本有序而不是區域性有序。

**如下:

void

shellsort(sqlist * l)

l->r[j+increment] = l->r[0];}}

}while(increment > 1);

}

因為希爾排序的關鍵是相隔某個「增量」(**中的increment)的記錄組成乙個子串行,實現跳躍式移動,所以「增量」的選擇就很重要。究竟選擇什麼樣的增量最好,目前還是乙個數學難題。但是大量的研究表明當增量序列

dlta[k] = 2^(t-k+1) -1(0 <= k <= t <= [log2(n+1)]) 時,可以取得不錯的效果。但是「增量」最後的結果一定要為 1 。時間複雜度為 o(n^(3/2))。另外希爾排序不是一種穩定的排序演算法(因為時跳躍式的移動)。

堆排序是對簡單選擇排序的一種改進,簡單選擇排序的主要優勢就是交換資料的次數少(最多n - 1次),但是比較的次數為n(n-1)/2。比較次數中有很多是重複比較的,就是說某兩個數之間的比較次數不止一次,最明顯的就是最後兩個數的比較。

如果可以每次做到在選擇到最小記錄的同時,根據比較結果對其他記錄做出調整,那麼效率就很高了。堆排序就是這麼做的。

在講堆排序之前先說什麼是「堆」,堆實際上是一棵完全二叉樹,這顆完全二叉樹每個結點的值都大於或者等於其左右孩子節點的值,稱為大頂堆(下圖左),或者每個結點的值都小於或者等於其左右孩子結點的值,稱為小頂堆(下圖右)。

先介紹乙個完全二叉樹的性質,**裡面用得到。

完全二叉樹性質:

如果i = 1;則結點 i 是完全二叉樹的根,無雙親;如果 i > 1,則其雙親結點 [i/2]。

如果 2i > n ,則結點 i 無左孩子(結點 i 為葉子結點);否則其左孩子是結點 2i。

如果 2i + 1 > n;則結點 i 無左右孩子;否則其右孩子是結點 2i + 1。

堆排序的基本思想是:將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n-1個元素重新構造成乙個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列了。

基本可分為三步:

void heapadjust(sqlist * l, int s, int m)

l->r[s] = temp;

}// 堆排序

void heapsort(sqlist * l)

for (i = l->length; i > 1; i--)

}

堆排序的時間複雜度為: o(nlogn);

大話資料結構

堆排序演算法解析

八大排序演算法 希爾排序

希爾的定義 希爾排序是插入演算法的一種,也叫縮小增量排序。是直接插入排序演算法的一種改良版。希爾演算法是把資料序列按下標的一定增量分組,對每組使用直接插入排序演算法進行排序 然後依次縮減增量再進行排序,待整個序列中的元素基本 注 沒有全部完成排序 有序時,再對全體元素進行一次直接插入排序。基本思想 ...

八大排序演算法 堆排序

排序,分為內部排序和外部排序,內部排序是指將資料記錄在記憶體中進行排序,而外部排序因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存,所以稱之為外部排序,我們這裡講的八大排序全部屬於內部排序。堆排序 heapsort 是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法,它是選...

八大排序 希爾排序

希爾排序 shell sort 是插入排序的一種。是直接插入排序的改進版,它是非穩定排序演算法。其得名於它的提出者d.l.shell,shell sort等演算法的提出打破了 排序演算法不可能突破o n 2 的魔咒,它將排序演算法的時間複雜度提成到了o nlogn 不可能超越的o n 2 徹底成為了...