希尔排序 java代码实现

希尔排序

希尔排序就是高级版的插入排序,还挺快的。

  • 它首先是将一个数组构建成多个列,就想堆排序需要先构建成二叉树一样,但是这个列 是自己想的 虚拟的 不会实质性的去改变数组的结构。
  • 然后循环每列,将每列的数都进行排序,按递增或递减排序
  • 当每列的值都排序好了,就再改变列数,就有点像插入排序了,看谁比这个数适合在哪儿
  • 循环完成后 当列数只有1的时候就完成了排序

比如最开始数组的长度为10 那么构建列 最初就为5,第二次的列就为2,最后一次就为1 这样都排序好了

举个栗子:

  1. 首先需要排序的数为 {0,2,3,5,4,1,6,9,8,7},构建成列,就为5列(10/2=5 为什么要用2为基数?你自己想)
0 2 3 5 4
1 6 9 8 7
  1. 这里构建为5列了,然后进行排序(按递增)第一次循环后 {0,2,3,5,4,1,6,9,8,7},数据凑巧,没有发生变化 哈哈哈哈,然后第二次构建列 5/2=2
0 2
3 5
4 1
6 9
8 7
  1. 构建好2列后,进行循环排序,比较一列 然后如果当前需要比较的值小于前一个值 就将前一个值赋值到后一个 循环这一列 直到最开始,最后修改的位置为j 所以将j位置赋值为tmp,排序好后构建一列 最后在进行排序,排序后{0,1,3,2,4,5,6,7,8,9}
0 1 
3 2
4 5
6 7
8 9
  1. 最后对一列开始排序,就完事儿了

CODE

public class Shell {
    public static void main(String[] args) {
        int[] num = {0,2,3,5,4,1,6,9,8,7};
        shellSort(num);
        for(int i: num){
            System.out.print(i+" ");
        }
    }

    public static void shellSort(int[] num) {
        //控制列数 比如从5列到2列 到1列 就完事儿
        for(int column = num.length/2; column > 0;  column /= 2){
            //从第一列 二的一个开始 一个一个走
            for(int i = column; i < num.length; i++){
                int tmp = num[i];
                //定位最后的位置
                int j;
                //比较一列 然后如果当前需要比较的值小于前一个值 就将前一个值赋值到后一个 循环这一列 直到最开始
                for(j = i; j >= column && num[j - column] > tmp; j -= column){
                    num[j] = num[j - column];
                }
                //最后修改的位置为j 所以将j位置赋值为tmp
                num[j] = tmp;
            }
        }
    }
}

它也是不稳定的!今天还有会儿才下班.芜湖,起飞!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值