思想: 希尔排序其实是插入排序的优化版本,对于插入排序来说其在数据规模较小或者待排数据基本有序的情况下性能最高,而希尔排序就是在插入排序的基础上将待排序的数据进行逻辑上的分组,目的在于使整体的数据逐渐基本有序,那么在最后将所有的数据进行排序的时候性能自然提高。
public class Main {
public static void main(String[] args) {
/**
* 希尔排序
* 1、原地排序
* 2、不稳定排序
* 3、空间复杂度O(1)
* 4、时间复杂度O(nlogn)
*/
int[] arr = new int[]{4,6,3,2,1,7,8};
int temp;
int j;
int distance = arr.length / 2;
//先进行分组 第一次分组是数组长度的一半取整
while (distance > 0) {
//对分组后的每一组进行排序操作
for (int i = distance; i < arr.length; i++) {
temp = arr[i];
j = i - distance;
while (j >= 0 && arr[j] > temp) {
arr[j+distance] = arr[j];
j -= distance;
}
arr[j+distance] = temp;
}
distance /= 2;
}
for (int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
}
}