前面已經提過最基本的三種排序(選擇,插入,冒泡),這裡,下面我再來說說希爾排序。
希爾排序其實屬於插入演算法,但又是優化的插入演算法,比之前演算法有了較大的改進。
希爾排序的基本思想:先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同乙個組中。先在各組內進行直接插人排序;然後,取第二個增量d2下面我們看下圖示:
然後上面圖示的第一趟排序後的結果為13274955 044938 65 97 76 (第一趟把數字分成5個子序列)
然後再看下面的圖示:
第二趟的結果為:1304 193827 495565 9776(第二趟把數列分成3個子序列)
最後再進行一下直接插入排序,就這樣,shell排序就over了。
在這我們看看希爾排序的優勢在哪:它每次都把整個數列分成有序的n份,然後再插入每一趟排序將使得數列部分有序,從而使得以後的插入排序很快找到插入位置。
另外最重要的是:shell排序演算法依賴一種稱之為「排序增量」的數列,不同的增量將導致不同的效率。
希爾排序的分析是乙個複雜度問題嗎因為它的時間是所取「增量」序列的函式,目前為止還沒有人求得一種最好的增量的序列,所以在這就不研究時間複雜度了。
看面看下演算法**:
code:
#include
voidshellinsert(int*a,intinc,intlen)
a[j]=x;
} }
intmain(void)
shellinsert(a,4,10);
for(inti=0;i<10;i++)//輸出排序後的數
} }
白話演算法之希爾排序
演算法第四版讀書筆記 希爾排序是插入排序的一種變種 理解了插入排序,將很好理解 核心思想 使陣列中,任意相距間隔h的元素都是有序的!這句話,筆者認為是理解希爾排序的核心語句了!將原陣列,每乙個間隔為 h 的元素,劃分為一組,看清楚了,不是將陣列按照間隔h進行分組,而是對元素劃分,在這些獨立陣列中使用...
排序演算法 希爾排序
如果乙個排序演算法,每次只把諸專案移動乙個位置,則它的平均執行時間至少要和n2成比例.因為在這個排序演算法執行的過程當中,每個記錄平均都必須遍歷n 3個位置,因此如果要對直接插入排序進行有效的,實質性的改進的話,就要有一種演算法,它可以使記錄做長距離的跳躍,而不是一步一步的挪動.希爾排序也是一種插入...
排序演算法 希爾排序
摘要 排序演算法有很多,最簡單的有氣泡排序和插入排序,這兩種方法都具有o n 2 的時間界.我們想要討論的是具有更好的時間界的排序演算法,比如希爾排序.1 希爾排序的思路是通過比較一定間距的元素來進行排序,最後再對所有相鄰元素進行一次插入排序.2 希爾排序最重要的引數是增量序列 h1,h2,ht 只...