希尔排序

希尔排序是对直接插入排序的一种改进,利用了直接插入排序在数量少,有序性比较好的情况下效率高.
所以产生增量的概念,根据增量d将数组分割为几个子数组,然后对子数组进行直接插入排序,于是在增量d逐步递减的时候,数组的有序性越来越好,所以子数组越来越大的情况下,排序的效率依然很高.
public static void shellSort(int a[]) {
int i, j, d;
int temp;
for (d = a.length / 2; d > 0; d /= 2) {
for (i = d; i < a.length; i++) {
temp = a[i];
for (j = i - d; j >= d - 1; j -= d) {
if (a[j] > temp) {
a[j + d] = a[j];
} else
break;
}
a[j + d] = temp;
}
}
}
程序主要是根据增量按照规则(初始length/2 也许是前人研究出来比较理想的吧)变化,不断进行插入排序,中间其实就是插入排序,不过直接插入排序每次都是改变移动相邻的一个位置,这里是将 j和j-d进行排序,直接插入排序j的for判断条件是j>=0,这里是j>=d-1,其实是一样的,因为增量d最后会递减到1,所以保证最后全部数的排序j>=0就行了.


public static void main(String args[]) {
int a[] = { 28, 69, 41, 77, 70, 0, 1, 49, 59, 2, 30, 59, 49, 0, 74, 19, 64, 50, 20, 11, 63, 10, 75, 51, 41, 90,
56, 80, 22, 24, 10, 58, 60, 76, 10, 63, 13, 85, 13, 53, 35, 83, 59, 10, 57, 31, 32, 93, 87, 4, 16, 86,
79, 29, 71, 2, 91, 2, 42, 51, 56, 31, 4, 85, 5, 42, 97, 91, 43, 55, 41, 77, 42, 50, 68, 0, 28, 60, 28,
38, 96, 92, 9, 79, 20, 98, 34, 18, 65, 47, 28, 87, 66, 25, 13, 14, 83, 60, 21, 87 };
shellSort(a);
for (int i : a) {
System.out.print(i + ",");
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值