希爾排序——重溫排序(二)
上篇文章提到,插入排序在待排序列基本有序的時候,效率會好很多。這篇文章介紹的希爾排序,其基本思想就是先讓序列基本有序,然後再進行插入排序。
一、演算法描述
希爾排序先將待排序列進行分組,分別進行插入排序,間隔為 gap
的元素為一組。待各組排序完成後,逐漸縮小 gap
的值,重複分組排序過程,直到 gap
值縮小為1,即對整個序列進行一次插入排序。
gap
一般先取 n / 2
,然後逐步 gap = gap / 2
,直到 gap
等於1。
二、圖示舉例
下面來看一個希爾排序的圖示,注意觀察兩個的關鍵字為25的元素,思考一下希爾排序的穩定性。
三、演算法實現
C語言版本程式碼奉上。
void shellSort(int list[], int count) {
for (int gap = count / 2; gap >= 1; gap /= 2) {
for (int i = 0; i < gap; ++i) {
insertSort(list, count, i, gap);
}
}
}
void insertSort(int list[], int count, int head, int gap) {
int temp, i, j;
for (i = head + gap; i < count; i += gap) {
temp = list[i];
for (j = i - gap; j >= head; j -= gap) {
if (list[j] <= temp) {
break;
}
list[j+gap] = list[j];
}
list[j+gap] = temp;
}
}
可以看到,希爾排序不過是一個不斷進行插入排序的過程。在這個過程中,去不斷地調整序列的頭位置 head
和間隔 gap
的值。而這裡用到的插入排序演算法,跟之前相比做了一點小調整,修改了待排元素的索引,加上了對應的 gap
偏移。
四、演算法分析
- 開始的時候
gap
值較大,子序列中的元素較少,排序速度較快,而且元素一次移動的距離較大。 - 隨著排序的進行,
gap
值逐漸縮小,子序列中元素個數逐漸變多,但由於前面的排序結果,子序列基本有序,因此排序也很快。 - 從圖示的例子中看出,兩個關鍵字為25的元素,在排序前後,它們的相對位置已經發生變化,所以希爾排序是一種不穩定的排序。
- 希爾排序需要比較次數和移動次數約為
n ^ 1.3
,當n
趨於無窮時可減少到n(log2(n))^2
。
五、總結
- 希爾排序的時間複雜度為
O( n(log2(n))^2 )
。 - 希爾排序是一種不穩定的排序。
獲取更佳的閱讀體驗,請訪問原文地址 【Lyman's Blog】希爾排序——重溫排序(二)
相關文章
- 希爾排序(二)排序
- 重溫快速排序排序
- 第二章 :查詢與排序-------希爾排序排序
- 希爾排序排序
- 排序演算法__希爾排序排序演算法
- 【排序演算法】- 希爾排序排序演算法
- 【排序】插入類排序—(折半)插入排序、希爾排序排序
- 希爾排序(一)排序
- Java希爾排序Java排序
- 理解希爾排序排序
- java 希爾排序Java排序
- 演算法(二)初等排序前篇[插入和希爾排序]演算法排序
- 排序演算法之希爾排序排序演算法
- C++希爾排序C++排序
- 希爾排序(C++)排序C++
- 【筆記】希爾排序筆記排序
- 希爾排序(Shell Sort)排序
- PHP 排序演算法之希爾排序PHP排序演算法
- 排序演算法(氣泡排序,選擇排序,插入排序,希爾排序)排序演算法
- 排序演算法 - 快速插入排序和希爾排序排序演算法
- 排序演算法:Java實現希爾排序排序演算法Java
- 排序演算法總結之希爾排序排序演算法
- 希爾排序java實現排序Java
- 重溫經典排序思想--C語言常用排序全解 (轉)排序C語言
- #排序演算法#【2】直接插入排序、希爾排序排序演算法
- 三種插入排序 直接插入排序,折半插入排序,希爾排序排序
- 【資料結構】希爾排序!!!資料結構排序
- 【資料結構】希爾排序資料結構排序
- 【小小前端】前端排序演算法第二期(繞人的希爾排序)前端排序演算法
- 七、排序,選擇、冒泡、希爾、歸併、快速排序實現排序
- rust-algorithms:14-希爾排序RustGo排序
- JavaScript希爾排序簡單介紹JavaScript排序
- 【PHP資料結構】插入類排序:簡單插入、希爾排序PHP資料結構排序
- Python八大演算法的實現,插入排序、希爾排序、氣泡排序、快速排序、直接選擇排序、堆排序、歸併排序、基數排序。Python演算法排序
- 【譯】Swift演算法俱樂部-希爾排序Swift演算法排序
- 【演算法】希爾排序的實現演算法排序
- 關於js陣列的六種演算法---水桶排序,氣泡排序,選擇排序,快速排序,插入排序,希爾排序的理解。JS陣列演算法排序
- 希爾排序使用直接插入排序、二分插入排序的C++程式碼實現演算法排序C++演算法