之前說的選擇,插入,冒泡三種基本排序,時間複雜度都為o平方,直到希爾排序的出現,打破了o平方的魔咒.希爾排序的基本思想我理解是屬於分而治之,把乙個無序序列劃分為若干個子串行,再分別對這寫子串行使用三種基本排序方法進行排序.
下邊直接看示意圖:
要排的序列為 int array = ;排序為公升序排序
第一次劃分:假設間隔d = 3,那麼可以劃分為得到三個子串行(乙個顏色集合為乙個子串行)
接著對三個子串行按基本排序法排序,得到,從這裡我們可以看到,這個序列已經基本有序.
第二次劃分:縮減間隔d=2,那麼可劃分為 得到兩個子串行,然後對這兩個子串行按基本排序法排序,
得到
第三次劃分:縮減間隔d=1,劃分為 ,到了這裡,整個序列基本已經排好了,只需要在使用一次基本排序,做少量的元素交換,便可完成序列的排序.
以上便是希爾排序的基本思想,先分而治之,劃分為各個子串行,各自排序,之後只需要統一做少量的交換工作,便可完成整個序列的排序.下邊來看看**,這裡我分別使用選擇排序,插入排序來實現
#include #include #include #include using namespace std;
//需要注意的是,這裡的類模板需要放在標頭檔案中去實現,這裡為了直觀,直接放這裡了
template class sort : public object
public:
//基於選擇排序的希爾排序
static void selectshell(t* narray, int nlen, bool min2max = true)
}if(index != i)
} count++;
}
}}//基於插入排序的希爾排序
main測試函式中分別用了基於插入排序與基於選擇排序的希爾排序來測試,乙個測公升序,乙個測降序,其結果是符合我們的預期的
排序演算法之希爾排序
希爾排序實際上是一種分治思想的插入排序。插入排序不說了,不清楚看這裡 分治思想,對增量為dk,dk遞減,開始很多小序列,最後為乙個大序列 相對直接插入排序,在希爾排序中,只不過增量不是1,而是dk 較好的增量序列是2 k 1,2 k 1 1,7,3,1,這樣可使shell排序時間複雜度達到o n 1...
排序演算法之希爾排序
希爾排序 shell sort 又稱為縮小增量排序,輸入插入排序演算法,是對直接排序演算法的一種改進。本文介紹希爾排序演算法。對於插入排序演算法來說,如果原來的資料就是有序的,那麼資料就不需要移動,而插入排序演算法的效率主要消耗在資料的移動中。因此可知 如果資料的本身就是有序的或者本身基本有序,那麼...
排序演算法之希爾排序
希爾排序,突破了 通過交換相鄰元素進行排序的任何演算法平均需要 n 2 的二次時間限制 通過比較相距一定間隔的元素來工作。使用乙個增量序列 h1 1,h2,ht,在使用乙個 增量h的一趟排序後,對於每乙個i滿足pdata i pdata i h 即此時序列是h排序的 各趟 比較所用的距離逐漸減小,直...