希爾排序(Shell Sort)
阿新 • • 發佈:2020-07-16
希爾排序(Shell Sort)
先追求表中的部分元素有序,再逐漸逼近全域性有序
定義和操作步驟
先將待排序表分割成若干行形如L[i,i+d,i+2d,...,i+kd]的“特殊”子表,對各個子表分別進行直接插入排序。縮小增量d,重複上述過程,直到d=1為止
把相對的位置的大小順序不對的對調。
第二趟把增量d縮小,對每個子表進行直接插入排序
第三趟的時候,d已經變成1了,相當於對錶進行操作。
整個表已呈現出“基本有序”,對整體在進行一次“直接插入排序”
考試中可能會遇到各種增量。判斷當時序列的狀態。
程式碼
//希爾排序 void ShellSort(int A[],int n){ int d,i,j; //A[0]只是暫存單元,不是哨兵,當j<=0時,插入位置已到 for(d=n/2;d>=1;d=d/2) //步長變化 for(i=d+1;i<=n;++i) if(A[i]<A[i-d]){ //需將A[i]插入有序增量子表 A[0]=A[i]; //暫存在A[0] for(j=i-d;j>0&&A[0]<A[j];j-=d) A[j+d]=A[j];//記錄後移,查詢插入的位置 A[j+d]=A[0]; //插入 } }
嘗試實現直接處理完一個子表的
演算法效能分析
空間複雜度:O(1)
時間複雜度:和增量序列d1,。。。的選擇有關,目前無法用數學手段證明確切的時間複雜度
最壞時間複雜度為O(n^2),當n在某個範圍內時,可以達到O(n^1.3)
穩定性:
不穩定。
適用性:僅適用於順序表,不適用於連結串列