希尔(插入)排序 c#代码

希尔排序是对直接插入排序的改进,通过引入增量将原始序列分为多个子序列,并在每个子序列中进行插入排序,使得整个序列趋于有序。增量序列的选择对排序效率有很大影响。
希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。

基本思想

  希尔排序基本思想:   先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行 直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。   该方法实质上是一种分组插入方法。   给定实例的shell排序的排序过程   假设待排序文件有10个记录,其关键字分别是:   49,38,65,97,76,13,27,49,55,04。  

 增量序列的取值依次为:   5,3,1

 ① 最后一个增量必须为1;

解读:
希尔排序算法引入了一个增量,该增量把原来的序列分割成多个序列,先在各个序列内进行插入排序,使整个序列变的“基本有序”。增量可以是多个,最后一个必须是1.本文的例子增量是5,3,1
当增量是5的时候,{【1】,【6】},{【2】,【7】}……是一组,总共5组。
他们先进行第一个希尔排序
然后增量为3的时候,{【1】,【4】,【7】,【9】},{【2】,【5】,【8】},{【3】,【6】,【9】}是一组。
继续进行希尔排序。
最后增量是1.整个序列是一组。

c#代码

 /// <summary>
        ///  希尔(插入)排序
        /// </summary>
        /// <param name="array"></param>
        /// <param name="increments">增量集合</param>
        static void ShellOrder(ref int[] array,int[] increments)
        {
            for(int n = 0;n < increments.Length;n++)
            {
                ShellInsert(ref array, increments[n]);
            }
        }

        static void ShellInsert(ref int[] array, int dk)
        {
            for (int i = 1 + dk; i < array.Length; ++i)
            {
                if (array[i] < array[i - dk]) //如果小于,【i】赋值到哨兵中
                {
                    array[0] = array[i];
                    int j = 0;
                    for (j = i - dk; j > 0 && array[0] < array[j] ; j -= dk) //记录后移,插入排序的基本原理,空出正确的位置
                    {
                        array[j + dk] = array[j];
                    }
                    array[j + dk] = array[0];
                }
            }
        }

//调用
 int[] array = {0,49,38,65,97,76,13,27,49 };
            int[] increments ={ 5,3,1};
            ShellOrder(ref array, increments);
            for (int n = 0; n < array.Length; n++)
            {
                Console.Write(array[n].ToString() + ",");
            }




本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

转载于:https://www.cnblogs.com/zjypp/archive/2010/08/17/2319293.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值