思路分析:
假设一个数组的长度为10,
先将这个数组分为 10/2 = 5组,每组有 2 个数据,每组中的每个数的角标相差5,如果这些组中的数据第一个比第二个大,则交换两个数据的位置
再将这个数组分为 5/2 = 2组,每组有5个数据,每组中的每个数的角标相差2,将这5个数据按照从小到大排序
再将这个数组分为 2/1 = 1 组,进行排序,得到的数组即为排序后的数组
希尔排序分为两种:交换式希尔排序和移位式希尔排序
一:交换式希尔排序:
这种交换式希尔排序,在每一个组中,每相邻两个元素都需要进行比较,相当于在希尔排序中用冒泡排序进行排序,速度太慢,效率太低
代码展示
public static void shellSort(int[] arr) {
int temp;
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]) {
temp = arr[j];
arr[j] = arr[j + gap];
arr[j + gap] = temp;
}
}
}
}
}
二:移位式希尔排序
代码展示:
public static void shellSortInsert(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];
while (j - gap >= 0 && temp < arr[j - gap]) {
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
}
}