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排序複雜度分析排序複雜度
- shell if 寫法
- shell基本語法
- 快速排序法排序
- 【指令碼】shell語法指令碼
- shell 語法介紹
- shell 指令碼寫法:指令碼
- Shell語法規範
- 選擇排序法排序
- 氣泡排序法排序
- shell指令碼之if elif寫法指令碼
- bash shell 無法使用 perl 正則
- Golang實現氣泡排序法Golang排序
- 挖坑填數+分治法:快速排序排序
- alanwang[GDOU] 用選擇排序法對10個整數排序排序
- HBase Shell 十大花式玩兒法
- 7-7 冒泡法排序 (20分)排序
- Mysql 分組排序的sql寫法MySql排序
- 線性建堆法與堆排序排序
- Linux-Shell語法(5)-常用命令Linux
- 使用 adb shell dumpsys gfxinfo 和 adb shell dumpsys SurfaceFlinger --latency 都無法獲取到資料
- JS氣泡排序的6種寫法JS排序
- 排序法:選擇、冒泡、插入和快排排序
- PHP基礎演算法之快速排序法PHP演算法排序
- 三種改變 PriorityQueue 排序方式的辦法排序
- 史上最全shell指令碼程式設計語法上冊指令碼程式設計
- PHP基礎演算法之選擇排序法PHP演算法排序
- PHP基礎演算法之氣泡排序法PHP演算法排序
- Shell:子shell概念
- shell——shell輸入輸出
- 求眾數、排序演算法、二分法排序演算法
- 排序:氣泡排序&快速排序排序
- Shell程式設計-11-子Shell和Shell巢狀程式設計巢狀
- 資料結構 8 基礎排序演算法詳解、快速排序的實現、瞭解分治法資料結構排序演算法
- Shell
- Shell程式設計 --- Shell介紹程式設計