zoukankan      html  css  js  c++  java
  • 希尔排序

    1.简介

    希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。

    2.算法实现

    原始的算法实现在最坏的情况下需要进行O(n2)的比较和交换。V. Pratt的书[1] 对算法进行了少量修改,可以使得性能提升至O(n log2 n)。这比最好的比较算法的O(n log n)要差一些。
    希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。
    假设有一个很小的数据在一个已按升序排好序的数组的末端。如果用复杂度为O(n2)的排序(冒泡排序或插入排序),可能会进行n次的比较和交换才能将该数据移至正确位置。而希尔排序会用较大的步长移动数据,所以小数据只需进行少数比较和交换即可到正确位置。
    一个更好理解的希尔排序实现:将数组列在一个表中并对列排序(用插入排序)。重复这过程,不过每次用更长的列来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身仅仅对原数组进行排序(通过增加索引的步长,例如是用i += step_size而不是i++)。

    3.排序过程

    最差时间复杂度 根据步长串行的不同而不同。O(nlog^2 n)

    最优时间复杂度 O(n)

    平均时间复杂度  根据步长串行的不同而不同。

     1  /// <summary>
     2         /// 希尔排序
     3         /// </summary>
     4         public class ShellSorter
     5         {
     6             public void Sort(int[] list)
     7             {
     8                 int inc;
     9                 for (inc = 1; inc <= list.Length / 9; inc = 3 * inc + 1) ;
    10                 for (; inc > 0; inc /= 3)
    11                 {
    12                     for (int i = inc + 1; i <= list.Length; i += inc)
    13                     {
    14                         int t = list[i - 1];
    15                         int j = i;
    16                         while ((j > inc) && (list[j - inc - 1] > t))
    17                         {
    18                             list[j - 1] = list[j - inc - 1];
    19                             j -= inc;
    20                         }
    21                         list[j - 1] = t;
    22                     }
    23                 }
    24             }
    25         }
  • 相关阅读:
    atoi (String to Integer) leetcode
    按层逆遍历一棵树,使用满二叉树存储
    unix网络编程-配置unp.h头文件
    ListView系列(七)——Adapter内的onItemClick监听器四个arg参数
    Windows系统下安装VirtualBox,系统找不到指定路径的做法
    Android Fragment完全解析,关于碎片你所需知道的一切
    【Android开源框架列表】
    fragment报错
    2013 年开源中国 10 大热门 Java 开源项目
    【移动开发】Android中三种超实用的滑屏方式汇总(ViewPager、ViewFlipper、ViewFlow)
  • 原文地址:https://www.cnblogs.com/PGYXZ/p/4805723.html
Copyright © 2011-2022 走看看