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 Sort)排序
- Shell排序複雜度分析排序複雜度
- Shell:子shell概念
- shell——shell輸入輸出
- 排序:氣泡排序&快速排序排序
- Shell程式設計-11-子Shell和Shell巢狀程式設計巢狀
- Shell
- Shell程式設計 --- Shell介紹程式設計
- shell指令碼(6)-shell陣列指令碼陣列
- Shell基礎教程七:Shell字串字串
- php插入排序,快速排序,歸併排序,堆排序PHP排序
- 【排序】插入類排序—(折半)插入排序、希爾排序排序
- 排序演算法(氣泡排序,選擇排序,插入排序,希爾排序)排序演算法
- 排序——氣泡排序排序
- 排序之快速排序排序
- 插入排序排序排序
- 排序之交換排序排序
- Shell程式設計-shell變數1程式設計變數
- 強大好用的shell之shell命令
- 【SHELL】Shell中的條件判斷
- PHP 常見4種排序 氣泡排序、選擇排序、插入排序、快速排序PHP排序
- shell基礎教程二十四: shell基礎教程: Shell檔案包含
- Shell Script
- LNMP shellLNMP
- Shell命令
- Shell 技巧
- Linux ShellLinux
- shell script
- shell概念
- win shell
- Python八大演算法的實現,插入排序、希爾排序、氣泡排序、快速排序、直接選擇排序、堆排序、歸併排序、基數排序。Python演算法排序
- Shell程式設計-02-Shell變數程式設計變數
- [GFCTF 2021]where_is_shell :)shell use new posture
- Shell總結01-Shell直譯器
- shell基礎教程 十六: Shell until迴圈
- 快速排序&&歸併排序排序
- 計數排序vs基數排序vs桶排序排序