思路
代码
public static void shellInsert(Integer[] arr) {
// 设置初始步长为数组长度的一半
int distance = arr.length / 2;
while (distance > 0) {
for (int i = 0; i < distance; i++) {
// 如果该组数据只有一条,则不用排序
if (i + distance > arr.length) {
continue;
}
for (int j = i; j < arr.length - distance; j+=distance) {
if (arr[j] <= arr[j+distance]) {
continue;
} else {
int temp = arr[j + distance];
for (int k = j; k >= 0; k-=distance) {
if (arr[k] > temp) {
arr[k + distance] = arr[k];
arr[k] = temp;
} else {
break;
}
}
}
}
}
distance /= 2;
}
}
总结
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。由于插入排序的时间复杂度不稳定性,最坏的情况交换次数和冒泡排序一样,最好的时候特别快,因此希尔排序的思想是将其拆分成多个较小的数组先进行排序,使整体具有更好的顺序性。
一般将初始步长设置为数组长度的一般,递减规则一般是取原步长的一半,但也可以根据实际情况来进行调整,毕竟目前还没有求证出最高效的步长取值标准。