数据结构与算法(java):希尔排序

希尔排序

又叫“缩小增量排序”,插入排序的一种更高效的改进版本

基本原理

1、选定一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组
2、对分好组的每一组数据完成插入排序
3、减小增长量,直到减小到1,重复第二步操作

增长量

确定增长量的规则如下

求出增长量的最大值,先设最开始 h=1,有如下规则:

int h = 1;
while(h<数组的长度/2){
	h = 2h+1;
}

接下来再根据规则减小增长量h

h = h/2;

增长量是用来控制分组的

图解

假设有数组:{9,1,2,5,7,4,8,6,3,5}
长度为10,所以初始的增长量由上面的方式可以求得为h=7,再一步步缩小增长量,来进行分组

当h = 7时
在这里插入图片描述
当h = 3时在这里插入图片描述
当h=1时在这里插入图片描述
在这里插入图片描述

具体代码
//主要思想:先分组,再进行排序
public class ShellSort {

    public static void main(String[] args) {
        //定义一个数组
        int arr[] = {9,1,2,5,7,4,8,6,3,5};
        //定义h来表示增长量
        int h = 1;

        while(h<arr.length){
            h = 2*h+1;    
        }

        while(h>=1){
            //根据h进行分组,找到待交换的元素
            for(int i = h; i<arr.length; i++){
                for(int j = i; j>=h; j-=h){
                    //比较并交换位置
                    if(arr[j-h]>arr[j]){
                        int temp;
                        temp = arr[j-h];
                        arr[j-h] = arr[j];
                        arr[j] = temp;
                    }else{
                        //直到将这一轮中最小的数移动到最前面时时退出循环
                        break;
                    }
                }
            }
            
            //缩小h的值,改变增长量
            h = h/2;
            //System.out.println(h + "\n");  //这串代码可以看到增长量的变化
        }

        for(int array : arr){
            System.out.print(array + " ");
        }
    }
}


可能写的有点混乱,但大致意思就这样了,个人理解,具体请结合代码,步步调试,很好理解的,有误望指出,一起进步呀

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值