• 排序算法(4)—希尔排序


      希尔排序(Shell's Sort)又称缩小增量排序(Diminishing Increment Sort),是插入排序的一种改进

      基本思想:设定一个元素增量gap,将参加排序的序列按这个间隔数gap从第1个元素开始依次分成若干子序列,对子序列进行排序,然后缩小增量gap,重新将整个序列按照新的间隔数gap进行划分,再分别对每个子序列进行排序,如此将“缩小增量gap——划分序列——将每个子序列进行排序“的操作进行下去,知道间隔数增量gap=1为止;

      gap间隔数的选择:如何选择最合适的间隔数序列才能达到最优的排序效果是至今尚未解决的数学难题,我们在一般排序中gap的初始值可设定为N/2(N为排序元素的个数,这里需要注意采用四舍五入的原则),以后每一趟排序,gap值减半,直到gap=1为止;

      举例分析:设有一个数据元素序列{3,6,4,2,11,10,5},要求按从小到大顺序排列,排序步骤如下图所示:

      从上图和直接插入排序的算法来看,比较次数和交换次数明显少于直接插入排序,代码如下所示(C#实现):

     1         public static int[] SortByShellsSort(int[] m_SourceArray)
     2         {
     3             int tmp;
     4             int length = m_SourceArray.Length;
     5             //gap如果不能被整除需要+1
     6             int gap = length / 2 + (length % 2 == 0 ? 0 : 1);
     7             while (gap >= 1)
     8             {
     9                 for (int i = 0; i + gap < length; i++)
    10                 {
    11                     if (m_SourceArray[i] > m_SourceArray[i + gap])
    12                     {
    13                         tmp = m_SourceArray[i];
    14                         m_SourceArray[i] = m_SourceArray[i + gap];
    15                         m_SourceArray[i + gap] = tmp;
    16                     }
    17                 }
    18                 if (gap == 1) break;
    19                 //gap如果不能被整除需要+1
    20                 gap = gap / 2 + (gap % 2 == 0 ? 0 : 1);
    21             }           
    22             return m_SourceArray;
    23         }

      算法分析:希尔排序属于不稳定的排序,时间复杂度为:O(N2), 空间复杂度:O(1) 

  • 相关阅读:
    【转】多线程:深入了解线程同步lock,Monitor,Mutex,同步事件和等待句柄(中)
    Mono初接触
    计算机颜色格式( 8位 16位 24位 32位色)
    我爱源代码
    Linux小白教程: tar的几种常用格式
    Linux小白教程:查看当前Linux的发行版本、内核(kernel)版本
    10大糟糕预测:
    一日编程小悟
    Linux小白教程:vi(shell文本编辑器)保存、退出命令
    C结构体中的函数指针与函数
  • 原文地址:https://www.cnblogs.com/Hua-Min/p/ShellsSort.html
Copyright © 2020-2023  润新知