基本思想:先将整个待排序的记录序列分割成若干个子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录依次进行直接插入排序。
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 }