• 希尔排序


    希尔排序

    希尔排序(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) 

     
     
     
    标签: 排序算法
  • 相关阅读:
    iOS开发之Socket
    IOS开发之Bug--使用KVC的易错情况
    IOS开发之功能模块--给任意的UIView添加点击事件
    IOS开发之开发者账号遇到的bug
    iOS开发--关于TableViewCell的可视化设置细节
    学习Coding-iOS开源项目日志(四)
    Learn how to Use UIPageViewController in iOS
    关于Storyboard的使用
    学习Coding-iOS开源项目日志(三)
    学习Coding-iOS开源项目日志(二)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3317430.html
Copyright © 2020-2023  润新知