希尔排序可以理解为是插入排序的进阶版,先将需要排序的数组分为gap组,再针对每一组进行插入排序,逐渐缩小gap的值,在缩小的时候数组会变得越来越有序,当gap为1的时候也就是对整个数组进行插入排序。
public static void main(String[] args) {
int[] arr = {5, 3, 6, 8, 9, 1, 2};
insertsort(arr);
System.out.println((Arrays.toString(arr)));
}
public static void insertsort(int[] arr) {
int gap = arr.length / 2;
while (gap > 1) {
shellsort(arr, gap);
gap = gap / 2;
}
shellsort(arr, 1);
}
private static void shellsort(int[] arr, int gap) {
int bound = gap;//从第一组的第二个元素开始
for (; bound < arr.length; bound++) {
int val = arr[bound];//同样需要把当前要排序的元素保存下来,以免搬运的时候被覆盖
int cur = bound - gap;//cur代表同组中的相邻元素。
for (; cur >= 0; cur -= gap) {//
if (arr[cur] > val) {
arr[cur + gap] = arr[cur];//同组中进行搬运。
} else {
break;
}
}
arr[cur + gap] = val;//此时说明找到了合适的位置。
}
}
希尔排序是一种不稳定排序,因为相同的元素可能会处于不同的分组中。肯能会打乱顺序