基本思想:先將整個待排序的記錄序列分割成若干個子序列,分別進行直接插入排序,待整個序列中的記錄“基本有序”時,再對全體記錄依次進行直接插入排序,
1)操作方法:選擇一個增量序列t1,t2,...,tk,其中ti>tj,tk=1;
2)按增量序列個數k,對序列進行k趟排序;
3)每趟排序,根據對應的增量ti,將待排序列分割成若干個長度為m的子序列,分別對各個子序列進行直接插入排序,僅增量因子為1時,整個序列作為一個表來處理,表長度即為整個序列的長度,

代碼實作:
1 private void shellSort(int[] a) {
2 int dk = a.length/2;
3 while( dk >= 1 ){
4 ShellInsertSort(a, dk);
5 dk = dk/2;
6 }
7 }
8 private void ShellInsertSort(int[] a, int dk) {
9 //類似插入排序,只是插入排序增量是 1,這里增量是 dk,把 1 換成 dk 就可以了,
10 for(int i=dk;i<a.length;i++){
11 if(a[i]<a[i-dk]){
12 int j;
13 int x=a[i];//x 為待插入元素
14 a[i]=a[i-dk];
15 for(j=i-dk; j>=0 && x<a[j];j=j-dk){
16 //通過回圈,逐個后移一位找到要插入的位置,
17 a[j+dk]=a[j];
18 }
19 a[j+dk]=x;//插入
20 }
21 }
22 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/136669.html
標籤:其他
上一篇:差分約束演算法————洛谷P4878 [USACO05DEC] 布局
下一篇:2018-2019 ACM-ICPC, Asia Xuzhou Regional Contest- H. Rikka with A Long Colour Palette -思維+貪心
