本章开始学习排序算法

1.初级排序算法

先从选择排序和插入排序这两个简单的算法开始学习排序算法。选择排序就是依次找到当前数组中最小的元素,将其和第一个元素交换位置,直到整个数组有序。

 public static void sort(Comparable a[]){
int N = a.length;
for(int i = 0; i < N; i ++){
int min = i; //最小元素索引
for(int j = i + 1; j < N; j++){
if(less(a[j], a[min])) min = j;
} exch(a, i, min);
}
}

而插入排序就像打poker一样,找到每个元素在小数组中的位置。

     public static void sort(Comparable a[]){
int N = a.length;
for(int i = 1; i < N; i ++){
//将a[i]插入a[i-1]、a[i-2]、a[i-3]...之中
for(int j = i; j > 0 && less(a[j], a[j-1]); j--){
exch(a, j, j-1);
}
}
}

算法思路相当简单,而本节比较有趣的地方是可视化排序算法。我们就实现这个可视化。

我们分为三个步骤。第一步,将一个数组的元素(这里我们选用double数据类型)用长条表示,并依次罗列在屏幕上。第二步,按照各个算法的思路将有序数组排序,画出一张可视轨迹图。第三步,将轨迹图动画化。

接下来的重头戏是比较选择排序和插入排序。通过下图的例子,我们可以看出第i个元素都进行一次交换和N-1-i次比较。对于长度为N的数组,选择排序要进行N^2/2次比较和N次交换。

而对于插入排序呢?情况比选择排序复杂。最坏情况(完全逆序)下,需要~N^2/2次比较和~N^2/2次交换;而最好情况(已经顺序)下,需要N-1次比较和0次交换。就如同例子中第3次插入时,S、T已经是有序的了,所以不存在交换的需要。对于随机排序的数组,在平均情况下每个元素都可能向后移动半个数组的长度,因此交换总数是~N^2/4,而比较次数是交换次数加上一个额外的项(相比N^2,可以忽略)。

而排序前数组的倒置(比如E-A)个数越少,插入排序就越快。接下来我们用随机数组来比较两种算法。

重复一百次的1000个随机数排序比较结果:

重复一百次的10000个随机数排序比较结果:

最后,我们可以得出:对于随机数组,插入排序和选择排序的运行时间是平方级别的,两者之比是一个较小的常数(本机测试为1.3~1.4)。

希尔排序的思想是使数组中任意减个为h的元素有序,也就是将插入排序的元素移动距离由1改变为逐渐增大的h。

 public static void sort(Comparable a[]){
int N = a.length;
int h = 1;
while(h < N/3) h = 3*h + 1;
while(h >= 1){
for(int i = h; i < N; i++){
for(int j = i; j >= h && less(a[j], a[j-h]); j -= h){
exch(a, j, j-h);
}
}
h = h/3;
}
}

这么做的原因是因为部分有序数组更适合插入排序。那么,我们就比较一下这两种算法的执行速度。

[读书笔记]算法(Sedgewick著)·第二章.初级排序算法的更多相关文章

  1. 第二章:排序算法 及其他 Java代码实现

    目录 第二章:排序算法 及其他 Java代码实现 插入排序 归并排序 选择排序算法 冒泡排序 查找算法 习题 2.3.7 第二章:排序算法 及其他 Java代码实现 --算法导论(Introducti ...

  2. Python基础教程 读书笔记(2)第二章 列表和元组

    2.1序列概览 列表和元组的主要区别在于,列表可以修改,元组则不能.也就是说如果要根据要求来添加元素,那么列表可能会更好用;而出于某些原因,序列不能修改的时候,使用元组则更为合适.使用后者的理由通常是 ...

  3. 读书笔记 - javascript 高级程序设计 - 第二章 在Html中使用JavaScript

    1 <script>的6个属性 async  立即下载当前script标签的外部脚本 但不能影响别的 charset 没用了 defer  文档显示之后再执行脚本,只对外部脚本有效 lan ...

  4. 《算法导论》第二章demo代码实现(Java版)

    <算法导论>第二章demo代码实现(Java版) 前言 表示晚上心里有些不宁静,所以就写一篇博客,来缓缓.囧 拜读<算法导论>这样的神作,当然要做一些练习啦.除了练习题与思考题 ...

  5. 《算法4》2.1 - 选择排序算法(Selection Sort), Python实现

    选择排序算法(Selection Sort)是排序算法的一种初级算法.虽然比较简单,但是基础,理解了有助于后面学习更高深算法,勿以勿小而不为. 排序算法的语言描述: 给定一组物体,根据他们的某种可量化 ...

  6. JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)

    1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...

  7. [读书笔记]算法(Sedgewick著)·第一章(1)

    到家放松放松之后就开始学习算法了,手里拿的是拿的是一本Robert Sedgewick的橙皮书<算法(第四版)>的.这本书与导论那本书的不同之处在于轻数学思想.重实现,也就是说这是一本很不 ...

  8. [读书笔记]算法(Sedgewick著)·第一章(2)

    接着上一篇,mindmap更新如下内容. 3.背包.队列和栈 这节主要讲述了这三种数据结构(Bag.Queue.Stack)的API.实现以及链表.Queue和Stack还含有删除元素的方法.并引出了 ...

  9. Unity Shader入门精要读书笔记(一)序章

    本系列的博文是笔者读<Unity Shader入门精要>的读书笔记,这本书的章节框架是: 第一章:着手准备. 第二章:GPU流水线. 第三章:Shader基本语法. 第四章:Shader数 ...

随机推荐

  1. 【IT历史】SP和CP

    1.什么是SP?SP是英文Service Provider的缩写,中文翻译为服务提供商,通常是指在移动网内运营增值业务的社会合作单位.它们建立与移动网络建立相连的服务平台,为手机用户提供一系列信息服务 ...

  2. noj [1479] How many (01背包||DP||DFS)

    http://ac.nbutoj.com/Problem/view.xhtml?id=1479 [1479] How many 时间限制: 1000 ms 内存限制: 65535 K 问题描述 The ...

  3. [XJOI NOI2015模拟题13] C 白黑树 【线段树合并】

    题目链接:XJOI - NOI2015-13 - C 题目分析 使用神奇的线段树合并在 O(nlogn) 的时间复杂度内解决这道题目. 对树上的每个点都建立一棵线段树,key是时间(即第几次操作),动 ...

  4. Ollydbg 中断方法浅探

    Ollydbg是一个新的32位的汇编层调试软件.适应于windows98.me.2000.xp和2003操作系统.由于他具有图形窗口界面,所以操作方便.直观,是cracker的好工具. 由于Ollyd ...

  5. Linux(CentOS)常用命令

    http://fedoranews.org/alex/tutorial/rpm/3.shtml rpm.org rpm -qa|grep mysql 查询已安装的含有mysql的包. mv 移动文件. ...

  6. ZOJ 3603 Draw Something Cheat

    点我看题目 题意 : 给你n个字符串,让你找出在每个字符串中出现的字母,按字典序输出来. 思路 :一开始想差了,以为记录下每个字符出现次数,然后找次数大于1的,可是我忘了可能在一个字符串中有AA,而另 ...

  7. lr11 BUG?Failed to send data by channels - post message failed.

    问题描述   : http协议,场景运行一会之后,报错! erro信息: Failed to send data by channels - post message failed. 解决方法 :ht ...

  8. 关于标准库中的ptr_fun/binary_function/bind1st/bind2nd

    http://www.cnblogs.com/shootingstars/archive/2008/11/14/860042.html 以前使用bind1st以及bind2nd很少,后来发现这两个函数 ...

  9. java代码转换为c# 工具

    Demo Java to C# Converter.exe 已下载到 F:\SoftWare-new\java\Java_to_CSharp_Converter.rar

  10. ActionBar官方教程(8)ShareActionProvider与自定义操作项提供器

    Adding an Action Provider Similar to an action view, an action provider replaces an action button wi ...