Java-希尔排序

1. 基本概念

    基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d,
    对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序,
    当增量减到1时,进行直接插入排序后,排序完成。

2. 算法分析

    1、将包含n个元素的数组,分成n/2个数组序列,第一个数据和第n/2+1个数据为一对...
    2、对每对数据进行比较和交换,排好顺序;
    3、然后分成n/4个数组序列,再次排序;
    4、不断重复以上过程,随着序列减少并直至为1,排序完成。

3. 代码实现

public void shellSort(int[] arr) {

    //定义插入间隔为数组长度的一半
    int h = arr.length / 2;

    while (h > 0){
        //插入排序 插入间隔
        System.out.println("插入间隔h=="+h);
        for (int i = h; i < arr.length; i++){
            //待插入数据
            int insertData = arr[i];
            int j = i;
            System.out.println("待插入数据 " + insertData);
            for ( ; j > h - 1  && insertData  < arr[j-h]; j-=h) {
                System.out.print(insertData +"和" + arr[j-h]+"比较 ");
                //如果待插入的数据比前面的数据小 则把前面的数据往后/右移动 留出待插入的位置
                arr[j] = arr[j - h];
            }
            System.out.println();
            arr[j] = insertData;
            SortUtil.printArr(arr);
        }
        System.out.println();
        //每次减少插入间隔为原来的一半  h最终会等于1 h=1时其实就是简单插入排序
        h = h / 2;
    }
}

4. 测试

@Test
public void test(){
    int arr[] = {6,3,8,2,9,1};
    System.out.println("排序前");
    printArr(arr);
    int[] data = sellSort(arr);
    System.out.println("排序后");
    printArr(data);
}

public void printArr(int[] arr){
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i]+" ");
    }
    System.out.println();
}

5. 总结

    希尔排序的关键并不是随便分组后各自排序,而是将相隔某个“增量”的记录组成一个子序列,实现跳跃式移动,
    使得排序的效率提高。需要注意的是,增量序列的最后一个增量值必须等于1才行。另外,由于记录是跳跃式的移动,
    希尔排序并不是一种稳定的排序算法。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值