lintcode 整数排序 | 希尔排序算法(Java)

本文介绍了一种高效的插入排序改进版本——希尔排序,并通过示例详细解析了其工作原理及算法实现过程。希尔排序通过按特定增量将数组分为多个子序列进行排序,最终达到整体有序的目的。

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

题目

给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法。

样例

对于数组 [3, 2, 1, 4, 5], 排序后为:[1, 2, 3, 4, 5]。

希尔排序

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
详细讲解戳这里百度百科

代码

public class Solution {
    /**
     * @param A an integer array
     * @return void
     */
    public void sortIntegers(int[] A) {
        int d = A.length;
        if (d <= 1) return;//过滤为空或者长度为1的数组
        while (true){//一直循环直到增量为1
            d = d/2;//每次增量缩小的比列,一般取一半,如果刚开始增量缩小的太小,容易造成超时,例如 d = d/5
            for(int x=0; x<d; x++){//从第0个开始循环,循环一组,即到增量的大小

                for (int i = x+d; i<A.length; i= i+d){//根据增量大小选出每组

                    int temp = A[i];
                    int j;
                    //将每组的数据选中的那个和他前面的进行比较,如果前面的数字大则进行交换,注意这里是j>=0
                    for (j = i-d; j>=0&&A[j]>temp; j = j-d){
                        A[j+d] = A[j];
                    }
                    //因为每次j = j-d,所以循环后j要加d 才是要交换的那个
                    A[j+d] = temp;
                }
            }
            if (d == 1){
                break;
            }
        }
    }
}

这里写图片描述

算法题目地址:http://www.lintcode.com/zh-cn/problem/sort-integers/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值