白話演算法之希爾排序

2022-06-30 19:30:10 字數 1761 閱讀 5404

演算法第四版讀書筆記

希爾排序是插入排序的一種變種 ;理解了插入排序,將很好理解

核心思想:使陣列中,任意相距間隔h的元素都是有序的!這句話,筆者認為是理解希爾排序的核心語句了!

將原陣列,每乙個間隔為 h 的元素,劃分為一組,看清楚了,不是將陣列按照間隔h進行分組,而是對元素劃分,在這些獨立陣列中使用插入排序,來完成核心思想,即任意相隔 h 的元素,都是有序的;

劃分原陣列的動作是一直進行的,直到間隔 h 為 1 了;當h=1的時候,使用插入排序,是必然可以完成整個陣列的排序的 ;

你可能會問:既然最後h=1了,並且每次都是進行插入排序;那麼跟我們之前直接使用插入排序有什麼不同嗎?或者我們為什麼還要進行之前的分割陣列呢?

我們都知道插入排序,在陣列中倒置的序列很少的場景中,是占有很大優勢的,甚至可以說是最快的排序演算法;

我們正是利用這種倒置序列很少的優勢,對乙個大陣列進行插入排序,很可能其中的倒置序列很多;但是對乙個小的陣列呢,因為輸入規模小,倒置序列必然也少,這樣插入排序就會很快;這就是為什麼要對原陣列進行間隔為h的步長劃分 ;我們要在小陣列中使用插入排序 ;

為什麼要一直劃分,直到h=1呢?

因為每一次h,劃分陣列,並不是原陣列的每乙個元素,都會被排到;因此,需要多次劃分,盡量做到盡可能多的元素,被排序過;怎麼確定盡可能多的元素被排序過呢?可能聰明的你,看到這,已經發現了只要在h=1之前,原陣列中有盡可能多的陣列被排序過,那麼最後一次掃尾h=1,就會被排的很快!因此,h的選擇,可能決定著我們希爾排序演算法的效率!

事實跟你想的一樣,h的選擇決定了希爾排序的效率!目前希爾排序最壞的效率是 n^(3/2),是小於n2

' role="presentation">n2n

2 的 ;

我們把h的值,叫做遞增序列; 其中書本上遞增序列的選擇是 h =h*3+1 ;

integer a = ;

int n = a.length;

int h = 1;

// 根據當前的序列,計算出最大步長

// 遞增序列選的不同,影響希爾排序的效率

while (h < n / 3)

//希爾排序的核心思想:將原來的陣列,每乙個相距h(步長)的元素,隸屬於乙個陣列,

// 這樣原陣列,就變為多個獨立的陣列,每次都將劃分出來的陣列,進行插入排序;

// 每進行完一輪,就改變步長h,迴圈往復,直到步長為1,

// 只要步長大於1,就繼續希爾排序

while (h >= 1)

}// 減少步長

h /= 3 ;

}example.show(a);

為什麼步長沒有像我們理解的那樣,步長是h,其實上述的**是精簡版,你要是寫成步長是h也行的,但是外面就需要再套一層迴圈了 ;

希爾排序,複雜度是說不清的,主要取決於遞增序列的選擇;但是無論選擇什麼,複雜度都是小於 n2

' role="presentation">n2n

2 的 ;

白話排序演算法(希爾排序)

前面已經提過最基本的三種排序 選擇,插入,冒泡 這裡,下面我再來說說希爾排序。希爾排序其實屬於插入演算法,但又是優化的插入演算法,比之前演算法有了較大的改進。希爾排序的基本思想 先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同乙個組中。先在各組內...

排序演算法之希爾排序

希爾排序實際上是一種分治思想的插入排序。插入排序不說了,不清楚看這裡 分治思想,對增量為dk,dk遞減,開始很多小序列,最後為乙個大序列 相對直接插入排序,在希爾排序中,只不過增量不是1,而是dk 較好的增量序列是2 k 1,2 k 1 1,7,3,1,這樣可使shell排序時間複雜度達到o n 1...

排序演算法之希爾排序

希爾排序 shell sort 又稱為縮小增量排序,輸入插入排序演算法,是對直接排序演算法的一種改進。本文介紹希爾排序演算法。對於插入排序演算法來說,如果原來的資料就是有序的,那麼資料就不需要移動,而插入排序演算法的效率主要消耗在資料的移動中。因此可知 如果資料的本身就是有序的或者本身基本有序,那麼...