zoukankan      html  css  js  c++  java
  • 排序算法--希尔排序(Shell Sort)_C#程序实现

    排序算法--希尔排序(Shell Sort)_C#程序实现

      排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题。例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困难。同样,存储在计算机中的数据的次序,对于处理这些数据的算法的速度和简便性而言,也具有非常深远的意义。

    1.基本概念

      排序是把一个记录(在排序中把数据元素称为记录)集合或序列重新排列成按记录的某个数据项值递增(或递减)的序列。

    2希尔排序(Shell Sort)

      1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。 

    2.1算法描述

    • 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:

      • 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
      • 按增量序列个数k,对序列进行k 趟排序;
      • 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

    2.2动态图演示

    2.3C#代码实现希尔排序

    希尔排序

            /// <summary>
            /// 希尔排序
            /// </summary>
            /// <param name="array"></param>
            public static int[] ShellSort(int[] array)
            {
                int length = array.Length;
                int k = 1;
                for (int h = length / 2; h > 0; h = h / 2)
                {                
                    for (int i = h; i < length; i++)
                    {
                        int temp = array[i];
                        if (temp.CompareTo(array[i - h]) < 0)
                        {
                            for (int j = 0; j < i; j += h)
                            {
                                if (temp.CompareTo(array[j]) < 0)
                                {
                                    temp = array[j];
                                    array[j] = array[i];
                                    array[i] = temp;
                                }
                            }
                        }
                    }
                    printArray(array);
                    Console.WriteLine("" + (k++) + ""+" 增量"+h);
                }
                return array;
            }

    打印数组

     1         /// <summary>
     2         /// 打印数组
     3         /// </summary>
     4         /// <param name="array"></param>
     5         private static void printArray(int[] array)
     6         {
     7             if (array == null || array.Length <= 0)
     8             {
     9                 return;
    10             }
    11             for (int i = 0; i < array.Length; i++)
    12             {
    13                 Console.Write("["+array[i]+"]"+",");
    14             }
    15         }

    测试代码:

    1             //希尔排序
    2             int[] arrayTest4 = new int[] { 9, 8, 5, 6, 7, 4, 3, 2, 1 };
    3             Console.WriteLine("
    ------------原数组--------------");
    4             printArray(arrayTest4);
    5             Console.WriteLine("
    ------------希尔排序--------------");
    6             int[] resultArray4 = ShellSort(arrayTest4);
    7             Console.WriteLine("排序结果:");
    8             printArray(resultArray4);

    运行结果:

  • 相关阅读:
    大前端的自动化工厂(1)——Yeoman
    推荐两个漂亮的编程字体
    javascript基础修炼(3)—What's this(下)
    javascript基础修炼(2)——What's this(上)
    javascript基础修炼(1)——一道十面埋伏的原型链面试题
    2018年8月中级前端开发推荐书籍
    React组件方法中为什么要绑定this
    Angularjs进阶笔记(2)-自定义指令中的数据绑定
    Angularjs1.X进阶笔记(1)—两种不同的双向数据绑定
    mysql多表查询
  • 原文地址:https://www.cnblogs.com/JiYF/p/8861381.html
Copyright © 2011-2022 走看看