shell排序法
原理
Shell排序法又稱為縮小增量排序法,也屬於插入排序類的演算法,是對直接插入排序的一種改進。
其基本思想就是:將需要排序的序列劃分為若干個較小的序列,對這些序列進行直接插入排序,通過這樣若干次操作可使需要排序的資料基本有序,最後再使用一次直接插入排序。這樣,首先對數量較小的序列進行排序,最後對基本有序的序列進行排序,從而使整個排序過程的效率得到提升。
實現
void shellSort(int a[],int n)
{
int i,j,gap,tmp;
for(gap=n/2;gap>0;gap/=2)//步長逐次減半
{
for(i=gap;i<n;i++)//迴圈內為一次gap步長內的排序
{
tmp=a[i];
for(j=i-gap;(j>=0&&a[j]>tmp);j-=gap)//將a[gap]與之前的同組元素一起進行排序
a[j+gap]=a[j];
a[j+gap]=tmp;
}
}
}
說明
Shell排序法被稱為縮小增量排序法,其排序分組是以增量確定的。隨著排序進行,增量逐漸減少,為1時即完成排序。
Shell排序中的依照增量分組,分組後進行排序,以下為一次排序示例
藍線連線起來的屬於一組。每次排序同組元素間進行插入排序。
雖然一遍排序中shell排序是穩定的,但多次排序之後,元素之間的移動可能會改變其順序,因此shell排序是不穩定的
shell排序平均時間複雜度為O(nlgn),其中分組的合理性會對演算法產生重要的影響。
相關文章
- Shell排序排序
- Shell氣泡排序排序
- 希爾排序(Shell Sort)排序
- [Shell] Sort排序的例子排序
- 排序:交換排序——氣泡排序法排序
- Shell排序複雜度分析排序複雜度
- shell if 寫法
- 快速排序法排序
- 交換排序法排序
- shell指令碼寫氣泡排序指令碼排序
- 《shell下sort排序命令的使用》排序
- shell基本語法
- (四)桶排序法排序
- 排序法(轉載)排序
- Shell中字串排序的幾種方法字串排序
- Shell語法規範
- shell 語法介紹
- 【指令碼】shell語法指令碼
- shell 語法 乾貨
- shell 指令碼寫法:指令碼
- bash shell 實現快速排序演算法排序演算法
- 選擇法和冒泡法排序介面排序
- 三種快速排序法排序
- makefile中的shell語法
- [27期] 氣泡排序法排序
- shell指令碼之if elif寫法指令碼
- Golang實現氣泡排序法Golang排序
- 挖坑填數+分治法:快速排序排序
- 直接插入排序法排序
- 冒泡,選擇排序法(C#)排序C#
- Shell第三篇:基本語法
- Linux Shell語法速查表Linux
- 指標對陣列排序選擇法和冒泡法指標陣列排序
- Mysql 分組排序的sql寫法MySql排序
- 7-7 冒泡法排序 (20分)排序
- 線性建堆法與堆排序排序
- 索引無法消除排序的問題索引排序
- alanwang[GDOU] 用選擇排序法對10個整數排序排序