码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构与算法之--高级排序:shell排序和快速排序【未完待续】

时间:2017-07-09 10:40:40      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:参考文献   有序   标记   数据   通过   参考   ges   技术   效果   

  高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序的是O(N*(logN)^2),而快速排序是O(N*logN)。

说明:下面以int数组的从小到大排序为例。

 

希尔(shell)排序

  希尔排序是基于插入排序的,首先回顾一下插入排序,假设插入是从左向右执行的,待插入元素的左边是有序的,且假如待插入元素比左边的都小,就需要挪动左边的所有元素,如下图所示:

技术分享==>技术分享

图1和图2:插入右边的temp柱需要outer标记位左边的五个柱子都向右挪动

 

如图3所示,相比插入排序,希尔排序是这样做的:对固定间隔的元素做插入排序,然后减小间隔,重复做插入排序,直到间隔减小为1。

技术分享 ==> 技术分享

图3和图4: outer位置和inner-h位置的柱子做插入排序 

数据量大的图形看这个过程更容易形象地把握算法特点,如图5和6,总元素数量等于100:

技术分享  技术分享

图5和图6:间隔分别为40和13执行完插入排序后的效果

相比简单插入排序,大间隔地做插入排序有两个好处:

  一是大间隔直接导致需要挪动的数据稀少,且数据挪动的效率高,图5中一次挪动可以跨越40个位置;

  二是,经过前一步大间隔的插入排序后,整个数组从整体上粗略地看已经有了明显的顺序,后一步小间隔的插入排序时,一部分操作是不需要挪动数据的,再次减少了挪动数据的次数。

间隔的序列:常用序列有Knuth提出,通过递归表示:h=*3h+1。

希尔排序的效率:“还没有人能够从理论上分析希尔排序的效率,各种基于实验的评估,估计它的时间级从O(N^(3/2))到O(N^(7/6))”--[1]。

 

快速排序

(未完待续。。。)

参考文献

【1】Java数据结构与算法 Rober Lafore 2nd

文中的图片

  来自文献【1】附带的Java applet演示小程序。

数据结构与算法之--高级排序:shell排序和快速排序【未完待续】

标签:参考文献   有序   标记   数据   通过   参考   ges   技术   效果   

原文地址:http://www.cnblogs.com/tlz888/p/7139123.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!