排序算法之希尔排序(Java)

本文介绍了希尔排序的基本概念及其改进的插入排序算法。希尔排序通过将待排序元素分成多个区域来提高效率,让元素能够更快地接近其最终位置。文章还详细说明了希尔排序的实现过程,并分析了其时间复杂度、空间复杂度及稳定性。

希尔排序简介

希尔排序(Shell Sort),也称递减增量排序算法,是Donald Shell在1959年提出来的一种排序算法。它是插入排序的一种更高效的改进版本。

希尔排序思想

希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已经排好的了。

步长序列

步长的选择是希尔排序的重要部分。只要最终步长为1任何步长序列都可以工作。算法最开始以一定的步长进行排序。然后会继续以一定步长进行排序,最终算法以步长为1进行排序。

希尔排序过程

具体排序过程如下图所示:

算法实现

/**
 * @description 对顺序表L作希尔排序
 * @author GongchuangSu
 * @since 2016.04.01
 * @version v1.0
 */
public class ShellSort {
    public static void main(String[] args) {
        // sqList[0]用作哨兵或临时变量
        int[] sqList = {
            1000, 50, 10, 90, 30, 70, 40, 80, 60, 20
        };
        shellSort(sqList);
        // 输出打印
        for (int i = 1; i < sqList.length; i++)
            System.out.println(String.valueOf(sqList[i]));
    }

    /**
     * 功能:希尔排序
     */
    private static void shellSort(int[] sqList) {
        int i, j;
        int increment = sqList.length - 1;
        do {
            // 增量序列
            increment = increment / 3 + 1;
            for (i = increment + 1; i < sqList.length; i++) {
                if (sqList[i] < sqList[i - increment]) {
                    // 需将sqList[i]插入有序增量子表
                    sqList[0] = sqList[i]; // 暂存sqList[0]
                    // 记录后移,查找插入位置
                    for (j = i - increment; j > 0 && sqList[0] < sqList[j]; j -= increment)
                        sqList[j + increment] = sqList[j];
                    sqList[j + increment] = sqList[0];
                }
            }
        } while (increment > 1);
    }
}

算法分析

时间复杂度

在最好的情况下,其时间复杂度为Θ(n1.3)
在最坏的情况下,其时间复杂度为Θ(n2)

空间复杂度

很明显,其空间复杂度为Θ(1)

稳定性

希尔排序是不稳定的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值