希尔(插入)排序 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注册。

posted @ 2010-08-17 22:35  音乐啤酒  阅读(280)  评论(0编辑  收藏  举报