希尔排序适用于数据量大而且无序,直接插入排序的适用于数据量小,而且无序。
对待排序待数据进行先宏观调整,再微观调整。
按步长划分,步长取值从大到小。直至为1。
首先按照 9/2 步长划分。 2,1,0 一组。–步长为4
分成了 4 个部分,每个部分进行一个直接插入排序。(2,1,0)进行插入排序。
一轮过去之后步长再除以2.直到步长为0.
代码
public class code1 {
public static void main(String[] args) {
int[] arr = new int[]{3, 5, 2, 7, 8, 1, 2, 0, 4, 7, 4, 3, 8};
System.out.println(Arrays.toString(arr));
shellsort(arr);
System.out.println(Arrays.toString(arr));
Arrays.sort(arr);
}
public static void shellsort(int[] arr) {
int k = 1;
//遍历所有的步长9/2开始的步长就是4//进行分组
//直到分组为0--结束
for (int d = arr.length / 2; d > 0; d /= 2) {
//每个步长的元素
//遍历本组的元素。
for (int i = d; i < arr.length; i++) {
//遍历对本组的元素i-d=0;本组都是插入排序,后面和前面的比
for (int j = i - d; j >= 0; j -= d) {
//如果当前元素大于加上步长后的元素
if (arr[j] > arr[j + d]) {
int temp = arr[j];
arr[j] = arr[j + d];
arr[j + d] = temp;
}
}
}
System.out.println("第" + k + "次排序" + Arrays.toString(arr));
k++;
}
}
}
运行结果