zoukankan      html  css  js  c++  java
  • 希尔(插入)排序 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注册。

  • 相关阅读:
    Spark学习之键值对(pair RDD)操作(3)
    Spark学习之RDD编程(2)
    Spark学习之基础相关组件(1)
    SAS进阶《深入分析SAS》之数据汇总和展现
    程序员必知的LinuxShell命令
    Java&Xml教程(八)使用JDOM将Java对象转换为XML
    DSp寄存器“是怎么和板子上的”具体地址“一一对应起来的
    WT588D播放合成语音时出现某些语句不能正常播报的情况,经过对比其他语句,看似有点不符合逻辑。
    模块化编程时中断函数的处理
    keil编译时出现*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
  • 原文地址:https://www.cnblogs.com/zjypp/p/2319293.html
Copyright © 2011-2022 走看看