java希尔排序
1、算法思想:希尔算法又名缩小增量排序,本质是插入排序,只不过是将待排序的序列按某种规则分成几个子序列,分别对几个子序列进行直接插入排序。这个规则就是增量,增量选取很重要,增量一般选序列长度一半,然后逐半递减,直到最后一个增量为1,为1相当于直接插入排序。
2、算法过程
举个栗子(第一趟的排序过程)
原始序列:49、38、65、97、76、13、27、49,55、04
1)序列长度为10,所以第一次分割增量len=5,进行分割序列,得到5个子序列
子序列1:49 13
子序列2: 38 27
子序列3: 65 49
子序列4: 97 55
子序列5: 76 04
2)分别对这5个序列进行直接插入排序
子序列1:13 49
子序列2: 27 38
子序列3: 49 65
子序列4: 55 97
子序列5: 04 76
结果: 13、27、49,55、04、49、38、65、97、76
3)增量缩减一半取len=2,分割的到2个子序列
子序列1:13 49 04 38 97
子序列2: 27 55 49 65 76
4)分别对这2个序列进行直接插入排序
子序列1:04 13 38 49 97
子序列2: 27 49 55 65 76
结果: 04 、27、13,49、38、55、49、65、97、76
5)最后增量取len=1,进行一次直接插入排序,得到完整的希尔排序
结果:04、13、27、38、49、49、55、65、76、97
public static void shellsort(int[] shell){
int len = shell.length;
for (int i = len/2;i >0; i=i/2 ){
for (int j = i; j < len; j++){
int k = j-i;
int middle = shell[j];
while (k>=0 && shell[k] >= middle){
shell[k+i] = shell[k];
k = k - i;
}
shell[k+i] = middle;
}
}
}