// int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
//希尔排序的第一轮排序
//因为第一轮排序,对半分,分成五组
int temp = 0;
for (int i = 5; i < arr.length; i++) {
//因为五组, 从小到大排序,当前元素 和步长+5的元素比较,并且交换位置
for (int j = i - 5; j >= 0; j -= 5) {
if (arr[j] > arr[i]) {
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
System.out.println("第一轮:" + Arrays.toString(arr));
// 第一轮:[3, 5, 1, 6, 0, 8, 9, 4, 7, 2]
for (int i = 2; i < arr.length; i++) {
//因为五组, 从小到大排序,当前元素 和步长+2的元素比较,并且交换位置
for (int j = i - 2; j >= 0; j -= 2) {
if (arr[j] > arr[j + 2]) {
temp = arr[j];
arr[j] = arr[j + 2];
arr[j + 2] = temp;
}
}
}
System.out.println("第2轮:" + Arrays.toString(arr));
// 第2轮:[0, 2, 1, 4, 3, 5, 7, 6, 9, 8]
//第三轮 分成1租
for (int i = 1; i < arr.length; i++) {
//因为五组, 从小到大排序,当前元素 和步长+1的元素比较,并且交换位置
for (int j = i - 1; j >= 0; j -= 1) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println("第3轮:" + Arrays.toString(arr));
// 第3轮:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
---- 整合后
public static void sort(int[] arr) {
int temp = 0;
for (int gap = arr.length; gap > 0; gap /= 2) {
for (int i = gap; i<arr.length;i++) {
//gap 步长
for (int j = i-gap; j >= 0; j -= gap) {
if (arr[j] > arr[j + gap]) {
temp = arr[j];
arr[j] = arr[j + gap];
arr[j + gap] = temp;
}
}
}
}
}