快速理解并学会希尔排序

希尔排序


前言

提示:了解希尔排序前必须先理解插入排序的原理,希尔排序是一种以插入排序为基础的排序,相当于插入排序的plus版本 。

插入排序:从第二个元素开始,和前面的元素依次进行比较,如果小于前面的元素则将前面的元素移到后面,直到碰见比它小的,最后将目标元素放到比它小的元素的前一个元素。

提示:希尔排序内部不要理解为交换元素(注意理解原理),而是插入排序,将目标元素放到合适是位置上!

一、希尔排序原理

第一次排序,步长为arr.length/2,将元素以步长进行分组,对这些组内元素进行插入排序(不是一个组的不管!!!)
第二次排序,步长为arr.length/2/2,再将元素以步长进行分组,对这些组内元素进行插入排序

最后一次排序,步长为1,相当于一次插入排序(由于前面的操作,大大减少了这次插入排序工作量)

二、代码演示

1.方法

注意看 j 的变换

public static void sheel(int [] arr){
        int gap=arr.length/2;//起始步长为arr.length/2,
        int j ;
        while(gap>0){

        for(int i=gap;i<arr.length;i++){//插入排序代码调整
                int value=arr[i];
                for( j=i-gap;j>=0;j=j-gap) {
 //从插入位置先前,遇见比value大的,就依次将前面的向后移动,否则结束循环
                    if (value < arr[j])
                        arr[j + gap] = arr[j];
                    else break;
                }
            arr[j + gap] = value;//将value放到合适的位置
            }
            gap=gap/2;//每一次大循环步长整除2
        }

    }

2.测试

public static void main(String[] args) {
        //测试代码
        int arr[]={2,4,2,43,22,55};
        sheel(arr);//希尔排序
        for(int p:arr)
            System.out.println(p);
    }

3.结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值