希尔排序
用法:对于直接插入排序问题,数据量巨大时
针对直接插入排序的下效率问题,有人对次进行了改进与升级,这就是现在的希尔排序。
希尔排序,也称 递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。
1、原理
1、将数的个数设为n,取奇数k=n/2,将下标差值为k的书分为一组,构成有序序列。
2、再取k=k/2 ,将下标差值为k的书分为一组,构成有序序列。
3、重复第二步,直到k=1执行简单插入排序。
2、实现
1、首先确定分的组数。
2、然后对组中元素进行插入排序。
3、然后将length/2,重复1,2步,直到length=0为止。
3、代码
public class SheelSort {
/* 希尔排序 */
public static void sort(int[] a) {
int len = a.length; // 单独把数组长度拿出来,提高效率
while (len != 0) {
len = len / 2;
for (int i = 0; i < len; i++) {// 分组
for (int j = i + len; j < a.length; j += len) {// 元素从第二个开始
int k = j - len;// k为有序序列最后一位的位数
int temp = a[j];// 要插入的元素
for(;k>=0&&temp<a[k];k-=len){ // 从后往前遍历
a[k+len]=a[k];
}
a[k + len] = temp;
OutNums.print2(j+" -- "+i, a);
}
}
}
}
}
4、测试结果
测试类:
控制台输出:
输出工具类:OutNums.java