排序之希尔排序

本文深入解析希尔排序算法,探讨其作为插入排序改进版的工作原理。通过不断减少间隔值进行部分排序,最终实现整体有序。文章详细介绍了希尔排序的实现步骤,包括间隔值的选择和递减间隔值排序的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序之希尔排序

简介

希尔排序是对插入排序的升级,要理解希尔排序需要先理解插入排序。希尔排序是选择不断减少的间隔值来进行插入排序,当间隔值到1的时候就基本有序了,这时就可以进行少量的操作完成排序了。

思路

1.选取间隔值:g

因为g的选取是比较复杂的,这里选取的是 g = g*3 +1的递推式来进行排序的,当然是按照递减的顺序排序并且最终的g应该为1,一般来说,只要不是2的幂次方的g就不会降低效率。(这句是看书上的…逃~~~)
这里是用的List进行存放的。

2.进行递减间隔值排序

这里的理解较为困难。
1.这个g就是说要从下标为g的位置开始到数组末尾。
2.在找要插入位置的时候是向前移动g个位置开始进行插入(条件是下标要大于0与插入排序的条件是不需要变的),也就是说是按照每隔g个位置是一个元素来进行排序的。
3.如此循环到g=1就结束了。
这里我说得可能太简单了,但我是如此理解的,如果不对欢迎指正。
下面是我的代码:

代码

class Solution {
    public int[] sortArray(int[] nums) {
        List list = new ArrayList<Integer>();
        for(int h = 1;;){
            if(h > nums.length){
                break;
            }
            list.add(h);
            h = h*3 + 1 ;
        }
        for(int i = list.size()-1;i >= 0 ;i--){
            int G = (int)(list.get(i));
            insertionSort(nums,G);
        }
        return nums;
    }
    public void insertionSort(int[] nums,int g){
        int j,tar;
        int n = nums.length;
        for(int i = g;i < n;i++){
            tar = nums[i];
            j = i - g;
            while(j >= 0 && nums[j] > tar ){
                nums[j+g] = nums[j];
                j = j - g;
            }
            nums[j+g] = tar;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值