排序演算法總結之希爾排序
希爾排序是按照不同步長對元素進行插入排序,實質就是把一組元素分為很多小組各自進行排序。
該方法的基本思想是:先將整個待排元素序列分割成若干個子序列,分別進行直接插入排序,然後元素的分隔逐漸減少,當增量足夠小(即為1時),再對全體元素進行一次插入排序,因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序時間效率比較高。
這裡用下別人的圖
以n=10的一個陣列49, 38, 65, 97, 26, 13, 27, 49, 55, 4為例
第一次 gap = 10 / 2 = 5
49 38 65 97 26 13 27 49 55 4
1A 1B
2A 2B
3A 3B
4A 4B
5A 5B
這裡就分了5組,每組都進行一次插入排序,完成之後,改變間距第二次 gap = 5 / 2 = 2
排序後
13 27 49 55 4 49 38 65 97 26
1A 1B 1C 1D 1E
2A 2B 2C 2D 2E
如圖分為兩組,再次進行插入排序,然後繼續減小間距,知道間距為1,所以希爾排序就是把直接插入排序用了多回的演算法 ,程式碼如下void ShellSort(int a[],int N)//N是待排元素個數
{
int tmp,i;
for(int gap=N/2;gap>0;gap/=2)//希爾排序增量
for(int j=gap;j<N;j++)//各組元素交替插入排序
{ tmp=a[j];
for(i=j;i>=gap&&a[i-gap]>tmp;i-=gap)
a[i]=a[i-gap];
a[i]=tmp;
}
}
希爾排序平均時間複雜度為O(n(1.3)),最好是O(n),最壞情況O(n(2)),並且是不穩定的相關文章
- 排序演算法之希爾排序排序演算法
- PHP 排序演算法之希爾排序PHP排序演算法
- 排序演算法__希爾排序排序演算法
- 【排序演算法】- 希爾排序排序演算法
- 排序演算法總結之堆排序排序演算法
- 排序演算法總結之歸併排序排序演算法
- 排序演算法 - 快速插入排序和希爾排序排序演算法
- 排序演算法:Java實現希爾排序排序演算法Java
- 排序演算法總結之直接選擇排序排序演算法
- 排序演算法(氣泡排序,選擇排序,插入排序,希爾排序)排序演算法
- #排序演算法#【2】直接插入排序、希爾排序排序演算法
- 程式猿修仙之路--演算法之希爾排序演算法排序
- 基礎演算法系列 之希爾排序演算法排序
- 希爾排序排序
- 【資料結構】希爾排序!!!資料結構排序
- 【資料結構】希爾排序資料結構排序
- #排序演算法#【6】排序演算法總結排序演算法
- 排序演算法之冒泡,選擇,插入和希爾排序演算法
- 對資料結構和演算法的總結和思考(三)--希爾排序資料結構演算法排序
- 希爾排序——重溫排序(二)排序
- 演算法(二)初等排序前篇[插入和希爾排序]演算法排序
- 【排序】插入類排序—(折半)插入排序、希爾排序排序
- 希爾排序(一)排序
- 希爾排序(二)排序
- Java希爾排序Java排序
- 理解希爾排序排序
- java 希爾排序Java排序
- 排序演算法總結排序演算法
- 【譯】Swift演算法俱樂部-希爾排序Swift演算法排序
- 【演算法】希爾排序的實現演算法排序
- (建議收藏)2020最新排序演算法總結:冒泡、選擇、插入、希爾、快速、歸併、堆排序、基數排序排序演算法
- 『演算法』之 初級排序演算法總結演算法排序
- python實現希爾排序演算法Python排序演算法
- C#演算法----(三)希爾排序 (轉)C#演算法排序
- 排序演算法全總結排序演算法
- 前端 排序演算法總結前端排序演算法
- 常用排序演算法總結排序演算法
- python演算法與資料結構-希爾排序(35)Python演算法資料結構排序