Shell排序
增量每次除以2遞減的
程式
void ModInsSort(int array[], int n, int delta)
{
for (int i = delta; i < n; i += delta)
{
for (int j = i; j >= delta; j -= delta)
{
if (array[j] < array[j - delta])
{
swap(array, j, j - delta);
}
else
{
break;
}
}
}
}
void ShellSort(int array[], int n)
{
//增量delta每次除以2遞減
for (int delta = n / 2; delta > 0; delta /= 2)
{
for (int i = 0; i < delta; i++)
{//分別對delta個子序列進行插入排序,&array[i]傳的是地址,陣列總長度為n-1
ModInsSort(&array[i], n - i, delta);
}
}
//如果增量序列不能保證最後一個delta間距為1
//可以安排下面這個掃尾性質的插入排序
// ModInsSort(array,n,1);
}
原理
首先delta為半個陣列,實現跨域陣列的插入排序
第一步排序結束後,delta值除以2,即現在每次進行插入排序的個數翻倍變成4
第二步結束後,下一步就變成了全部再來一遍插入排序
但這樣排序的時間代價是0(n^2)
,原因是每次還是會有重複出現的數進行排序,上一輪間距為2^k-1
的子序列都是有那些間距為2^k
的子序列組成的,上一輪迴圈中這些子序列已經排過序了
所以我們需要選擇特殊的增量序列
其它形式的Shell排序
Hibbard增量序列
{2^k - 1, 2^(k-1) - 1, ..., 7, 3, 1}
或者採用增量除以3,Shell(3)的序列來排序
這樣的序列效率都可以達到0(n^(3/2))
Shell最好的代價
呈2^p*3^q
形式的一系列整數
1, 2, 3, 4, 6, 8, 9, 12
這樣的排序效率為0(n*log2(n))
相關文章
- shell排序法排序
- Shell氣泡排序排序
- 希爾排序(Shell Sort)排序
- [Shell] Sort排序的例子排序
- Shell排序複雜度分析排序複雜度
- shell指令碼寫氣泡排序指令碼排序
- 《shell下sort排序命令的使用》排序
- Shell中字串排序的幾種方法字串排序
- bash shell 實現快速排序演算法排序演算法
- [Shell] 統計字串出現的次數和排序(cut,sort,uniq)字串排序
- 排序:氣泡排序&快速排序排序
- 【排序】插入類排序—(折半)插入排序、希爾排序排序
- 排序:交換排序——氣泡排序法排序
- 企業shell面試題:獲取51CTO部落格列表倒序排序考試題面試題排序
- php插入排序,快速排序,歸併排序,堆排序PHP排序
- 排序演算法(氣泡排序,選擇排序,插入排序,希爾排序)排序演算法
- 排序(2)--選擇排序,歸併排序和基數排序排序
- 排序(1)--插入排序和交換排序排序
- shell中呼叫shell的三種方式&並行shell並行
- 插入排序排序排序
- 排序之快速排序排序
- 排序——氣泡排序排序
- 排序之交換排序排序
- [排序] 歸併排序排序
- [Shell] Shell 生成 HTML指令碼HTML指令碼
- PHP 常見4種排序 氣泡排序、選擇排序、插入排序、快速排序PHP排序
- O(lgn)的三種排序,快速排序、歸併排序、堆排序排序
- shell
- Shell程式設計-11-子Shell和Shell巢狀程式設計巢狀
- 非交換排序-計數排序和桶排序排序
- 計數排序、桶排序和基數排序排序
- Python八大演算法的實現,插入排序、希爾排序、氣泡排序、快速排序、直接選擇排序、堆排序、歸併排序、基數排序。Python演算法排序
- shell指令碼(6)-shell陣列指令碼陣列
- Shell基礎教程七:Shell字串字串
- Shell程式設計 --- Shell介紹程式設計
- 【shell 】 使用 shell 計算成績
- Shell入門——shell特性、變數變數
- 快速排序&&歸併排序排序