希尔排序
解决插入排序,位置靠后的元素需要对数组进行不断位移的问题
核心: 分组插入排序
关键词:步长、3个for循环(2个for一个while)
动图(移动法)
代码(交换法)
public static void shellSort(int[] arr) {
for (int gap = arr.length / 2; gap > 0; gap /= 2) {
for (int i = gap; i < arr.length; i++) {
for (int j = i - gap; j >= 0; j -= gap) {
if (arr[j] > arr[j + gap]) {
int temp = arr[j];
arr[j] = arr[j + gap];
arr[j + gap] = temp;
}
}
}
}
}
问题:交换法使用临时变量进行交换,速度慢,使用移动法(参考插入排序)提升速度
代码(移动法)
public static void shellSort2(int[] arr) {
for (int gap = arr.length / 2; gap > 0; gap /= 2) {
for (int i = gap; i < arr.length; i++) {
int j = i;
int temp = arr[j];
if (arr[j] < arr[j - gap]) {
while (j - gap >= 0 && temp < arr[j - gap]) {
// 移动
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
}
}
}
本文动图来源:https://www.cnblogs.com/onepixel/p/7674659.html