演算法篇 插入排序與希爾排序

2021-10-24 02:26:40 字數 1475 閱讀 1811

希爾排序

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

log⁡n)

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.的...