插入排序——3希尔排序实现

本文详细介绍了希尔排序算法,一种高效的排序方法。通过逐步减小增量,将原始无序序列转换为部分有序状态,最终达到完全排序的目的。文章给出了具体的实现代码,并解释了其工作原理。

希尔排序又称缩小增量排序,这种排序方法先将整体的无序序列进行分组,设定每个组的大小为分组因子dk。分完组后,第i个和第i+dk个,i+2dk个,i+3dk个...元素为一个组。然后对这个组进行某种方式的排序,可以使用插入排序。

对每个组排完序之后,得到一个“有序程度”好一些的序列。然后缩小分组因子dk的值。再进行一次这样的排序。直到dk为1时,进行最后一次排序。

这样就将整个序列排序完毕了。

下面给出使用交换排序的方式实现的代码示例:

public void ShellSort(int[] ary)
        {
            for (var dk = ary.Length / 2; dk >= 1; dk = dk / 2)
            {
                // 把距离为 dk 的元素编为一个组,扫描所有组
                for (int i = dk; i < ary.Length; i++)
                {
                    int j = 0;
                    int temp = ary[i];//暂存当前的值,最后一组的对应位置的值

                    // 对距离为 dk 的元素组进行排序,第一次排序每个组一定最多有2个元素,这时可理解为进行交换排序。
                    //从最后一组,向前,对应位置的两个值进行比较,实际上进行插入排序
                    for (j = i - dk; j >= 0 && temp < ary[j]; j = j - dk)
                    {
                        ary[j + dk] = ary[j];
                    }
                    ary[j + dk] = temp;
                }
            }
        }

 

转载于:https://www.cnblogs.com/asenyang/p/6917379.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值