希尔排序

package com.heu.wsq.basic.sort_algorithm;

/**
 * 希尔排序
 * @author wsq
 * @date 2021/4/16
 * 希尔排序(Shell sort)是基于插入排序的快速排序算法,第一个打破O(n2)的排序算法
 * 对于大规模乱序数组插入排序很慢,因为它总是需要交换相邻的元素,因此元素只能一点一点地从数组的一端移动到另一端。
 * 希尔排序会优先比较距离较远的元素。交换不相邻的元素以对数组的局部进行排,最终使用插入排序将局部有序的数组排序。
 */
public class ShellSort {
    public void sort(int[] nums){
        int n = nums.length;
        // 定义希尔排序的初始间隔为1,如果h为1时候,退化为插入排序
        int h = 1;

        /**
         * 动态调整h的大小,一般h直接取为n/2也可以
         */
        while(h < n/3){
            h = h * 3 + 1;
        }

        while(h >= 1){
            for(int i = h; i < n; i++){
                for(int j = i; j >= h && less(nums[j], nums[j - h]); j -= h){
                    swap(nums, j, j - h);
                }
            }
            h /= 3;
        }
    }
    private boolean less(int num1, int num2){
        return num1 < num2;
    }
    private void swap(int[] nums, int i, int j){
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] =  tmp;
    }

    public static void main(String[] args) {
        int[] arr = {5, 2, 1, 7, 9, 3, 8 ,2};
        ShellSort shellSort = new ShellSort();
        shellSort.sort(arr);

        for(int i = 0; i < arr.length; i++){
            System.out.print(i + ",");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值