希尔排序-java实现

是一种基于插入排序的快速的排序算法;对于大规模乱序数组插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点地从数组 的一端移动到另一端。例如,如果主键最小的元素正好在数组的尽头,要将它挪到正确的位置就需 要 N-1 次移动。希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部 进行排序,并最终用插入排序将局部有序的数组排序。

现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序列“基本有序”后,最后在对所有元素进行一次直接插入排序。

增量为h,则分成h个组,所有距离为h的倍数的都在一个组里,先在各组直接插入排序,

然后取第二个增量h2 重复如此;直到增量h =1;

/**
 * 希尔排序
 * O(N*(logN)^2)
 */
public int[] shellSort(int[] a){
    if (a == null)
        return null;
    if (a.length ==1){
        return a;
    }

    int inserIndex = 0;
    int gap = a.length/2;
    while (gap>0)
    {
        for (int i = gap; i < a.length; i++) {
            inserIndex =i;
            int temp = a[i];
            while (inserIndex>=gap && a[inserIndex-gap]>temp){
                a[inserIndex] = a[inserIndex-gap];
                inserIndex-=gap;
            }
            a[inserIndex]=temp;
        }
        gap = gap/2;
    }
    return a;
}

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值