我们证明,使用增量$1, 2, 3, 4, 6, 8, 9, 12, 16, ..., 2^p*3^q$的Shell排序,时间复杂度为$O(n*{\log^2 n})$。

Edit:Latexified

Shell排序算法依赖一种称之为“排序增量”的数列,不同的增量将导致不同的效率。假如我们对20个数进行排序,使用的增量为1,3,7。那么,我们首先对这20个数进行“7-排序”(7-sortedness)。所谓7-排序,就是按照位置除以7的余数分组进行排序。具体地说,我们将把在1、8、15三个位置上的数进行排序,将第2、9、16个数进行排序,依此类推。这样,对于任意一个数字$k$,单看$A(k), A(k+7), A(k+14), ...$这些数是有序的。7-排序后,我们接着又进行一趟3-排序(别忘了我们使用的排序增量为1,3,7)。

只要排序增量的第一个数是1,Shell排序算法就是正确的。但是不同的增量将导致不同的时间复杂度。我们上面例子中的增量$(1, 3, 7, 15, 31, ..., 2^k-1)$是使用最广泛的增量序列之一,可以证明使用这个增量的时间复杂度为$O(n^{1.5})$。今天我们证明,使用增量$1, 2, 3, 4, 6, 8, 9, 12, 16, ..., 2^p*3^q$,时间复杂度为$O(n*{\log^2 n})$。

很显然,任何一个大于1的正整数都可以表示为$2x+3y$,其中$x$和$y$是非负整数。于是,如果一个数列已经是2-排序的且是3-排序的,那么对于此时数列中的每一个数$A(i)$,它的左边比它大的只有可能是$A(i-1)$。那么,在这个增量中的1-排序时每个数找插入位置只需要比较一次。一共有n个数,所以1-排序是$O(n)$的。

事实上,这个增量中的2-排序也是$O(n)$,因为在2-排序之前,这个数列已经是4-排序且6-排序过的,只看数列的奇数项或者偶数项(即单看每一组)的话就又成了刚才的样子。这个增量序列巧妙就巧妙在,如果我们要进行h-排序,那么它一定是$2h$-排序过且$3h$-排序过,于是处理每个数$A(i)$的插入时就只需要和$A(i-h)$进行比较。

现在,这个增量中的每一趟排序都是$O(n)$的,我们只需要数一下一共跑了多少趟。也就是说,我们现在只需要知道小于$n$的数中有多少个数具有$2^p*3^q$的形式。要想$2^p*3^q$不超过$n$,$p,q$的取值分别最多$O(\log n)$个,两两组合的话共有$O(\log n*\log n)$种情况。于是,这样的增量排序需要跑$O({\log^2 n})$趟,总的复杂度为$O(n*{\log^2 n})$。

转载于:https://www.cnblogs.com/dc93/p/3924345.html

O(n* (logn)^2 )的Shell排序——转自Matrix67的博客相关推荐

  1. 企业shell面试题:获取51CTO博客列表按时间倒序排序

    企业shell面试题:获取51CTO博客列表倒序排序考试题 老男孩教育培训机构需求:需求入下: 请把http://oldboy.blog.51cto.com 地址中的所有博文,按照时间倒序列表如下: ...

  2. 用lambda对std::list排序 - 力为的技术博客 - C++博客

    用lambda对std::list排序 - 力为的技术博客 - C++博客 用lambda对std::list排序 std::list提供了两个排序方法:std::list::sort() 和std: ...

  3. java shell排序算法_【算法】8种排序算法(Java)

    排序算法 上一篇博客中写到了关于动态规划中一些常见的问题和解决方案,根据问题总结出来解决动态规划类问题的方法是通过寻找状态,列出状态转移方程,通过遍历即可将问题解决.排序也是一类常见的问题,通过排序的 ...

  4. 数据结构与算法之--高级排序:shell排序和快速排序

    高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序大约是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希 ...

  5. 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)...

    写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...

  6. 快排,归并和Shell排序

    快速排序 快速排序的执行流程: (1) 先从数列中取出一个数作为基准数. (2) 将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. (3)再对左右区间重复第二步,直到各区间只有一个数. ...

  7. 排序算法系列:Shell 排序算法

    概述 希尔排序(Shell Sort)是 D.L.Shell 于 1959 年提出来的一种排序算法,在这之前排序算法的时间复杂度基本都是 O(n2n^{2}n2) 的,希尔排序算法是突破这个时间复杂度 ...

  8. shell排序_Java后端技术精选:希尔排序

    要点 希尔(Shell)排序又称为缩小增量排序,它是一种插入排序.它是直接插入排序算法的一种威力加强版.该方法因DL.Shell于1959年提出而得名. 希尔排序的基本思想是: 把记录按步长 gap ...

  9. C++shell排序(附完整源码)

    C++shell排序 shell排序 shell排序代码 性能 shell排序 shell排序在不相邻的元素之间比较和交换.利用了插入排序的最佳时间代价特性,它试图将待排序序列变成基本有序的,然后再用 ...

最新文章

  1. Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组、split函数垂直拆分二维numpy数组
  2. SCCM2007 R2统计软件使用频率,SCCM系列之七
  3. re:Invent解读:没想到你是这样的AWS
  4. Windows Server 2008 WDS实现跨网段实现远程部署
  5. 数学之美!这些美轮美奂的数学动图
  6. SpringMVC流程架构图
  7. fov视场角计算_图像传感器集成计算功能,赋能机器视觉技术
  8. html 上标下标 特殊字符等
  9. ITIL4-foundation学习和考试心得
  10. python导入excel加入折线图_python(win32com)在excel中插入折线图
  11. 【学术】自然语言处理国内外著名会议、期刊
  12. Learning Center Probability Map for Detecting Objects in Aerial Images 论文学习笔记
  13. 保险精算--第8周作业
  14. 名帖347 怀素 草书《大草千字文》
  15. 【web渗透思路】敏感信息泄露(网站+用户+服务器)
  16. 全球与中国中型徒步鞋市场深度研究分析报告
  17. 接口做的好怎么形容_9个色彩搭配网站,没当过设计师也能做好配色了
  18. 切图案例实操课程二-姜威-专题视频课程
  19. 安全 安全 安全……
  20. 学堂在线部分网课笔记---Web设计与应用

热门文章

  1. JavaScript的函数声明与函数表达式的区别
  2. django request对象和HttpResponse对象
  3. Python 中文Key 报错问题
  4. 利用strut2标签自动生成form前端验证代码
  5. Win32 控件篇(6)
  6. 浅谈ASP.NET的内部机制(二)
  7. Python学习笔记之类(二)
  8. Oracle数据库安装Version12c
  9. 《代码敲不队》第三次作业:团队项目的原型设计
  10. 从零开始搭建口袋妖怪管理系统(3)-实现一个简单的SPA管理系统