可以传入规定排序范围的参数(low/high),进行局部排序;
该程序把首次“步长”设置为需要排序数组长度的1/2,并又程序自行求出之后的一系列步长(求解规则为 下一次步长=上一次步长/2 的向上取整),直至最后一次求得步长为1;
public static <T extends Comparable<T>> void shellSort(T[] array, int low, int high) {
int[] delta = new int[(int) Math.ceil(Math.log(array.length) / Math.log(2))];
for (int i = 0; i < delta.length; i++) {
delta[i] = array.length / (int) Math.pow(2, i + 1);
}
for (int i = 0; i < delta.length; i++) {
shellInsert(array, 0, array.length - 1, delta[i]);
}
}
public static <T extends Comparable<T>> void shellInsert(T[] array, int low, int high, int deltaK) {
for (int i = low + deltaK; i <= high; i++) {
if (array[i].compareTo(array[i - deltaK]) < 0) {
T temp = array[i];
int j = i - deltaK;
for (; j >= low && temp.compareTo(array[j]) < 0; j -= deltaK) {
array[j + deltaK] = array[j];
}
array[j + deltaK] = temp;
}
}
}
如有Bug还请大佬评论区留言。