希尔是插入的一种优化算法,也叫缩小增量法
基础思路:
a.不断分组分到最后一组再进行其他排序
b.分组不断/2,直到为1
图示如下:
我们再来看看动图:
代码如下:
public void winxier(int num[]){
// 跟插入排序区别不大,外面加了个循环分组
// 分组
for (int fenzhu = num.length/2; fenzhu >0 ;fenzhu/=2) {
// 中层循环表示分成几个小组,且j=i指每个小组的后一个
for (int zhu = fenzhu; zhu<num.length; zhu++) {
// 根据插入排序,这里保存的右边无序分区
int right=num[zhu];
// 左边有序分区跟右边比较的指
int leftindex=zhu-fenzhu;
// leftindex>=0 防止数组越界 num[leftindex]>right只有右边分区小于左边才会进去
while (leftindex>=0 && num[leftindex]>right){
// 左边分区值向后挪动
num[leftindex+fenzhu]=num[leftindex];
// 当前下标值比较完后,下标向左移动,又因为不属为i
leftindex-=fenzhu;
}
// 优化:当判断满足时证明leftindex移动了
if (leftindex-fenzhu!=zhu){
num[leftindex+fenzhu]=right;
}
}
}
System.out.println(Arrays.toString(num));
}
测试:
int num[]=new int[800000];
for (int i = 0; i <num.length; i++) {
num[i] = (int) (Math.random() * 800000);
}
// 测试
Date d1 = new Date();
SimpleDateFormat s = new SimpleDateFormat("YY-MM-DD HH:mm:ss:SSS");
String s1 = s.format(d1);
System.out.println("排序前的时间;" + s1);
// 普通
// sort(a);
// 优化
x.winxier(num);
Date d2 = new Date();
String s2 = s.format(d2);
System.out.println("优化排序后时间;" + s2);
}