希爾排序
void
insertionsort
(int a,
int length)
//空出來的a[j+1]就是a[i]應該放的位置
a[j +1]
= key;
}}
可以寫為
void
insertionsort
(int a,
int length)
}
插入排序時間複雜度為o(n
2)
o(n^2)
o(n2
),但其常數很小,適合小陣列的排序,並且排序是穩定的,相等的數,排序前和排序後的前後位置不變。
因為其常數較小,在歸併排序中,小陣列的排序用插入排序來替代能夠加速不少。
當陣列較大時,插入排序其o(n
2)
o(n^2)
o(n2
)複雜度的劣勢就愈發的明顯。當然,肯定比氣泡排序優。因為氣泡排序的交換操作比插入排序的移動操作要慢得多。
插入排序適合逆序對少,小陣列的情況。
在資料量大的時候,插入排序就顯得很吃力了,其時間複雜度是o(n
2)
o(n^2)
o(n2
)的。插入排序適合的是小陣列、逆序對少的情況。
那麼,面對乙個大陣列,能不能為插入排序建立出這兩個條件呢?這就是希爾排序。
希爾排序通過對大陣列進行分組,化整為零,然後對每一組進行插入排序,為插入排序創造了小陣列的條件。
每一組一開始只有幾個元素,並且對每一組都進行了插入排序。組內元素是有序了,但是整體還是很亂的。所以後面逐漸把分組減少,使每一組的元素數量更多。
在分組減少時,因為前面已經進行小組內的插入排序,使得元素已經相對有序,這就為後面的插入排序創造了逆序對相對較少的條件。
所以,通過主動為插入排序創造小陣列、逆序對少這兩個條件,使得雖然經過了n次的插入排序後,最後一次也進行了一次完整的插入排序,但是最後的結果是時間複雜度降到了o(n
1.5)
o(n^)
o(n1.5
)以下,下界為o(n
logn)
o(n \log n)
o(nlogn)
,為最早突破 o(n
2)
o(n^2)
o(n2
)複雜度的排序演算法之一。
希爾排序的時間複雜度受增量序列影響,取不同的增量序列,得到的時間複雜度不同,而最常用的是2,4
,8,.
..,2
n2, 4, 8,... ,2^n
2,4,8,
...,
2n的序列,這不是最快的增量序列,但是寫法比較簡單。
排序演算法 插入排序與希爾排序
最近一直在看 演算法 正好複習到了排序這部分,就都總結一下。插入排序 插入排序和選擇排序都屬於非常簡單而且容易理解的排序演算法。插入排序就像我們平時玩的紙牌,在排順序的時候,會按照順序一張一張插入。在乙個亂序陣列中,同樣如此,我們會在遍歷中,將資料按照公升序或降序方式向之前已經排列好的資料中進行插入...
插入排序演算法 希爾排序
插入排序演算法 希爾排序 希爾排序思想是將陣列每次分成不同的陣列同時進行排序,劃分的方式是設定增量值,即h length 2,h 2 與直接排序最大的不同就是比較的陣列值下標間隔不同。希爾排序在資料量龐大的時候進行排序效率高,時間短。觀察下圖,根據以上思想,進行移動。如下 include void ...
排序演算法 插入排序 希爾排序
1 相鄰資料之間相比較。先是1,0 然後2,1 1,0 以此類推 總結 大for從1 n 小for從i 0,之後判斷交換即可 public void charusort for int i 1 i a.length i 2 希爾排序是插入排序特殊化,他不再比相鄰資料,而是可以比較類似1,4,13.的...