0
点赞
收藏
分享

微信扫一扫

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

希尔排序

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

基本原理

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){
            //找到待交换的元素
            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 条评论