希尔排序:
希尔排序又叫缩小增量排序,是插入排序的一种(或者说是插入排序的改进版)。
算法描述:希尔排序通过将一组数据按照一定的增量对数据进行分组,对分组后的每组数据进行插入排序,实现了相隔较远的数据之间的排序,在不断进行插入排序的过程中,整组数据越来越接近有序,最后增量为1时,就是一次完整的插入排序了。可能有人会问,既然都是插入排序,为什么还要特地将希尔排序分出来呢?这是因为插入排序在对一组有序程度越高的数据进行排序时效率越高,所以希尔排序的时间复杂度突破了O(n2),而且希尔排序的时间复杂度会随着增量取值的不同而不同。
代码实现:(以常用的增量设置举例)
public class ShellSort {
// 希尔排序(缩小增量排序):将整组数据按照增量分组,对每一组数据进行插入排序,使得整组数据越来越接近有序,增量为1作为结束的标志,执行最后一次插入排序后结束希尔排序
public static int[] shell(int[] arr) {
// 如果数组是null或者数组元素只有一个直接返回
if (arr == null || arr.length == 1) {
return arr;
}
// 设置希尔增量
int len = arr.length / 2;
while (len > 0) {
for (int i = len; i < arr.length; i++) {
// 标记要插入的新数据
int temp = arr[i];
int j;
// j是按照希尔增量分组后i之前的数据
// 当j<0或者遇到比新元素temp小的数据时循环结束
for (j = i - len; j >= 0 && arr[j] >= temp; j -= len) {
if (arr[j] > temp) {
arr[j + len] = arr[j];
}
}
arr[j + len] = temp;
}
len /= 2;
}
return arr;
}
public static void main(String[] args) {
int[] arr = new int[] { 1, 6, 4, 8, 3, 10 };
int[] arr1 = new int[arr.length];
arr1 = shell(arr);
for(int i=0;i<arr.length;i++) {
System.out.print(arr1[i]+" ");
}
}
}