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

  高级排序比简单排序要快的多,简单排序的时间复杂度是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演示小程序。

时间: 2024-09-30 09:02:46

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

Shell编程之三 —— shell script 脚本(未完待续)

1.脚本的语法构成: shell script 是利用 shell 的功能所写的一个『程序(program)』,这个程序是使用纯文本文件(文件后缀名最好为sh文件,方便我们管理),将一些 shell 的语法与指令(含外部指令)写在里面, 搭通配符.配正规表示法.管线命令与数据流重定向.条件判断.循环逻辑等功能,以达到我们所想要的处理目的. 构成(常见):shell语法和外部指令   通配符     [a-z]  [A-Z]     ?    *          正规表达式      管线命令

Java数据结构和算法之数组与简单排序

一.数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它.数组可被定义为任何类型,可以是一维或多维.数组中的一个特别要素是通过下标来访问它.数组提供了一种将有联系的信息分组的便利方法. 一维数组 一维数组(one‐dimensional array )实质上是相同类型变量列表.要创建一个数组,你必须首先定义数组变量所需的类型.通用的一维数组的声明格式是: type var‐name[ ]; 获得一个数组需要2步: 第一步,你必须定义变量所需的类型. 第二步,你必

细菌觅食优化算法:理论基础,分析,以及应用(未完)

原作者:Swagatam Das,Arijit Biswas,Sambarta Dasgupta,和Ajith Abraham  [摘 要]细菌觅食优化算法(Bacterial foraging optimization algorithm[BFOA])已经被分布式优化和控制的同行们当作一种全局性的优化算法接受.BFOA是由大肠杆菌的群体觅食行为所启发而总结出来 的.BFOA已经吸引了足够多的研究者的注意,由于它出现在解决真实世界中一些应用领域上优化问题的高效性.E.coli 的群体策略的生物基

几种常用排序算法(bubble、select、insert、shell、未完待续)

接下来两天重新看看几种常用的排序算法. 1.冒泡排序法 每次从 i=0开始比较相邻的元素,若arr[i]>arr[i+1],则交换它们.直到把最大的元素推向最后.回到 i=0,直至完成. 1 import java.util.Scanner; 2 class bubble 3 { 4 public static void main(String[] args) 5 { 6 int n,temp; 7 int i,j; 8 int[] arr=new int[10000]; 9 Scanner s

数据结构与算法笔记(3) 排序算法基础

1.什么是排序 排序就是将一个数据元素(或记录)的任意序列,通过一定的方法重新排列成一个按关键字有序的序列的过程. 2.排序的稳定性 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的:否则称为不稳定的. 稳定的排序的优点是,从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用. 例如,假设一个班的学生已经按照学号大

数据结构与算法系列十三(选择排序)

1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法?

php面试题之二——数据结构和算法(高级部分)

二.数据结构和算法 1.使对象可以像数组一样进行foreach循环,要求属性必须是私有.(Iterator模式的PHP5实现,写一类实现Iterator接口)(腾讯) <?php class Test implements Iterator{ private $item = array('id'=>1,'name'=>'php'); public function rewind(){ reset($this->item); } public function current(){

排序-shell排序

在插入排序中,所有的元素都是挨个和前一个元素进行比较,并置换位置.所以交换的次数为N的平方级别.极端情况下,如果最小元素在最右侧,那么需要逐个和前面元素进行置换.如果将比较的间隔增大,那么会减少移动次数,然后逐次降低比较间隔. 于是比较的间隔的序列如下 h = 3*h+1. 代码如下: 1 #include <iostream> 2 3 using namespace std; 4 5 void change(int *p,int pos1,int pos2); 6 void shellSor

python 下的数据结构与算法---6:6大排序算法

一:冒泡排序(Bubble Sort) 原理:假设有n个数,第一轮时:从第一个元素开始,与相邻的元素比较,如果前面的元素小就交换,直到第n-1个元素时,这样的结果是将最大的元素放到了最后,同理,第二轮还是从第一个元素开始比较,直到第n-2个元素,这样能够把剩下的n-1个数中的最大的数放到第n-1的位置,一直这样进行n-1轮就能够完成排序. 1 def Bublesort(seq): 2 i = 0 3 j = 0 4 while i < len(seq): 5 while j < len(se