数据结构---希尔排序

本文详细介绍了希尔排序的逐步折半增量实现,并对比分析了Hibbard增量序列(2k-1)和Sedgewick增量序列((9x4k)-(9x2k)+1)如何改善排序效率。希尔排序的时间复杂度在不同增量序列下有所变化,分别为O(n3/2)和O(n4/3)。虽然希尔排序不稳定,但在处理部分有序数组时表现出较好的性能。
摘要由CSDN通过智能技术生成


对原始数组预处理,然后使用插入排序。
满足: 数组元素较少数组大部分元素有序俩个条件。

逐步折半增量

在这里插入图片描述
逐步分组进行粗调,再进行直接插入排序的思想,就是希尔排序。
分组跨度(4,2,1)

JAVA实现

//逐步折半+插入排序
public class MyShellSort {
    public static void shellSort(int[] array){
        int d = array.length;//希尔排序的增量
        while (d>1){
            d=d/2;
            //x是在当前希尔增量下,数组被划分的组数
            //对每一个组,进行插入排序
            for (int x = 0;x<d;x++){
                //原始有序区的下标是x,x+d是当前待插入值的下标
                for (int i = x+d;i<array.length;i=i+d){
                    int temp = array[i];
                    int j;
                    //i-d是有序区最右边的值的下标
                    for (j=i-d;(j>=0)&&(array[j]>temp);j=j-d){
                        array[j+d] = array[j];//只覆盖,最后赋值
                    }
                    array[j+d] = temp;
                }
            }
        }
    }

测试方法:

    public static void main(String[] args) {
        int[] array = {5,8,6,3,9,2,1,7};
        shellSort(array);
        System.out.println(Arrays.toString(array));
    }

在这里插入图片描述

逐步折半增量存在的问题:
在这里插入图片描述

对于这样的数组,希尔排序不但没有减少直接插入排序的工作量,反而白白增加了分组操作的成本。

原因:每一轮希尔增量之间是等比的,这就导致了希尔增量存在盲区。

Hibbard增量

增量序列:1,3,7,15…
通项公式:2k-1
使用这种增量的希尔排序,最坏的时间复杂度为:O(n3/2)

Sedgewick增量

增量序列:1,5,19,41…
通项公式:(9x4k)-(9x2k)+1
使用这种增量的希尔排序,最坏的时间复杂度为:O(n4/3)

总结

希尔排序是不稳定排序,值相同的元素有可能被调换位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值