标题：大话数据结构
编辑推荐
超级畅销书《大话设计模式》作者的新作！用户群更为广泛，写作风格一如既往，技术沉淀更加深厚，势必掀起全民数据结构的热潮！
内容简介
本书为超级畅销书《大话设计模式》作者程杰潜心三年推出的扛鼎之作！以一个计  算机教师教学为场景，讲解数据结构和相关算法的知识。通篇以一种趣味方式来叙述，大量引用了各种各样的生活知识来类比，并充分运用图形语言来体现抽象内容，对数据结构所涉及到的一些经典算法做到逐行分析、多算法比较。与市场上的同类数据结构图书相比，本书内容趣味易读，算法讲解细致深刻，是一本非常适合自学的读物。
本书以一个计算机教师教学为场景，讲解数据结构和相关算法的知识。通篇以一种趣味方式来叙述，大量引用了各种各样的生活知识来类比，并充分运用图形语言来体现抽象内容，对数据结构所涉及到的一些经典算法做到逐行分析、多算法比较。与市场上的同类数据结构图书相比，本书内容趣味易读，算法讲解细致深刻，是一本非常适合自学的读物。
作者简介
一个被读者誉为很适合写IT技术书的家伙。《大话设计模式》作者。此书07年末出版至今已经简体版印刷9次、繁体版印刷6次，取得了较好的成绩，开创了一种适合国人阅读的趣味讲解IT知识的风格模式。其本人参与过政府、证券、游戏、交通等多种行业的软件开发及项目管理工作，也曾做过软件培训的教师。因曾有过两年半高中数学教学的独特经历，使得其书作当中处处以初学者视角考虑和分析问题，他成为了当前很受欢迎的IT技术图书作者之一。
图书目录
第1章数据结构绪论        1 
1.1开场白         2 
如果你交给某人一个程序，你将折磨他一整天；如果你教某人如何编写程序，你将折磨他一辈子。 
1.2你数据结构怎么学的？        3 
他完成开发并测试通过后，得意地提交了代码。项目经理看完代码后拍着桌子对他说：“你数据结构是怎么学的？” 
1.3数据结构起源        4 
1.4基本概念和术语        5 
正所谓“巧妇难为无米之炊”，再强大的计算机，也要有“米”下锅才可以干活，否则就是一堆破铜烂铁。这个“米”就是数据。 
1.4.1数据        5 
1.4.2数据元素        5 
1.4.3数据项        6 
1.4.4数据对象        6 
1.4.5数据结构        6 
1.5逻辑结构与物理结构        7 
1.5.1逻辑结构        7 
1.5.2物理结构        9 
1.6抽象数据类型        11 
大家都需要房子住，但显然没钱考虑大房子是没有意义的。于是商品房就出现了各种各样的户型，有几百平米的别墅，也有仅两平米的胶囊公寓…… 
1.6.1数据类型        11 
.1.6.2抽象数据类型        12 
1.7总结回顾        14 
1.8结尾语        15 
最终的结果一定是，你对着别人很牛的说“数据结构——就那么回事。” 
第2章算法        17 
2.1开场白        18 
2.2数据结构与算法关系        18 
计算机界的前辈们，是一帮很牛很牛的人，他们使得很多看似没法解决或者很难解决的问题，变得如此美妙和神奇。 
2.3两种算法的比较        19 
高斯在上小学的一天，老师要求每个学生都计算1+2+…+100的结果，谁先算出来谁先回家…… 
2.4算法定义        20 
现实世界中的算法千变万化，没有通用算法可以解决所有问题。甚至一个小问题，某个解决此类问题很优秀的算法却未必就适合它。 
2.5算法的特性        21 
2.5.1输入输出        21 
2.5.2有穷性        21 
2.5.3确定性        21 
2.5.4可行性        21 
2.6算法设计的要求        22 
求100个人的高考成绩平均分与求全省所有考生的成绩平均分在占用时间和内存存储上有非常大的差异，我们自然追求高效率和低存储的算法来解决问题。 
2.6.1正确性        22 
2.6.2可读性        23 
2.6.3健壮性        23 
2.6.4时间效率高和存储量低        23 
2.7算法效率的度量方法        24 
随着n值越来越大，它们在时间效率上的差异也就越来越大。好比有些人每天都在学习，而另一些人，打打游戏、睡睡大觉，毕业后前者名企争着要，后者求职处处无门。 
2.7.1事后统计方法        24 
2.7.2事前分析估算方法        25 
2.8函数的渐近增长        27 
2.9算法时间复杂度        29 
理解大o推导不算难，难的其实是对数列的一些相关运算，这考察的更多的是数学知识和能力。 
2.9.1算法时间复杂度定义        29 
2.9.2推导大o阶方法        30 
2.9.3常数阶        30 
2.9.4线性阶        31 
2.9.5对数阶        32 
2.9.6平方阶        32 
2.10常见的时间复杂度        35 
有些时候，告诉你某些东西不可以去尝试，也是一种知识的传递。总不能非要去被毒蛇咬一口才知道蛇不可以去招惹吧。 
2.11最坏情况与平均情况        35 
2.12算法空间复杂度        36 
事先建立一个有2050大的数组，然后把所有年份按下标数字对应，如果是闰年，此数组项的值就是1，如果不是就是0。这样，所谓的判断某一年是否是闰年就变成了查找这个数组的某一项的值是多少的问题。 
2.13总结回顾        37 
2.14结尾语        38 
愚公移山固然可敬，但发明炸药和推土机，可能更加实在和聪明。 
第3章线性表        41 
3.1开场白        42 
门外家长都挤在大门口与门里的小孩子的井然有序，形成了鲜明对比。哎，有时大人的所作所为，其实还不如孩子。 
3.2线性表的定义        42 
3.3线性表的抽象数据类型        45 
有时我们想知道某个小朋友（比如麦兜）是否是班级的同学，老师会告诉我说，没有，麦兜是在春田花花幼儿园里。这种查找某个元素是否存在的操作很常用。 
3.4线性表的顺序存储结构        47 
他每次一吃完早饭就冲着去了图书馆，挑一个好地儿，把他书包里的书，一本一本的按座位放好，长长一排，九个座硬是被他占了。 
3.4.1顺序存储定义        47 
3.4.2顺序存储方式        47 
3.4.3数据长度与线性表长度区别        48 
3.4.4地址计算方法        49 
3.5顺序存储结构的插入与删除        50 
春运时去买火车票，大家都排队排着好好的，这时来了一个美女：“可否让我排在你前面？”这可不得了，后面的人像蠕虫一样，全部都得退后一步。 
3.5.1获得元素操作        50 
3.5.2插入操作        51 
3.5.3删除操作        52 
3.5.4线性表顺序存储结构的优缺点        54 
3.6线性表的链式存储结构        55 
反正也是要让相邻元素间留有足够余地，那干脆所有元素都不要考虑相邻位置了，哪有空位就到哪里。而只是让每个元素知道它下一个元素的位置在哪里。 
3.6.1顺序存储结构不足的解决 
办法        55 
3.6.2线性表链式存储结构定义        56 
3.6.3头指针与头结点的异同        58 
3.6.4线性表链式存储结构代码描述        58 
3.7单链表的读取        60 
3.8单链表的插入与删除        61 
本来是爸爸左牵着妈妈的手、右牵着宝宝的手在马路边散步。突然迎面走来一美女，爸爸失神般地望着，此情景被妈妈逮个正着，于是扯开父子俩，拉起宝宝的左手就快步朝前走去。 
3.8.1单链表的插入        61 
3.8.2单链表的删除        64 
3.9单链表的整表创建        66 
3.10单链表的整表删除        69 
3.11单链表结构与顺序存储结构优缺点        70 
3.12静态链表        71 
对于一些语言，如basic、fortran等早期的编程高级语言，由于没有指针，这链表结构，按照前面我们的讲法，它就没法实现了。怎么办呢？ 
3.12.1静态链表的插入操作        73 
3.12.2静态链表的删除操作        75 
3.12.3静态链表优缺点        77 
3.13循环链表        78 
这个轮回的思想很有意思。它强调了不管你今生是穷是富，如果持续行善积德，下辈子就会好过，反之就会遭到报应。 
3.14双向链表        81 
就像每个人的人生一样，欲收获就得付代价。双向链表既然是比单链表多了如可以反向遍历查找等的数据结构，那么也就需要付出一些小的代价。 
3.15总结回顾        84 
3.16结尾语        85 
如果你觉得上学读书是受罪，假设你可以活到80岁，其实你最多也就吃了20年苦。用人生四分之一的时间来换取其余时间的幸福生活，这点苦不算啥。 
第4章栈与队列        87 
4.1开场白        88 
想想看，在你准备用枪的时候，突然这手枪明明有子弹却打不出来，这不是要命吗。 
4.2栈的定义        89 
类似的很多软件，比如word、photoshop等，都有撤消（undo）的操作，也是用栈这种思想方式来实现的。 
4.2.1栈的定义        89 
4.2.2进栈出栈变化形式        90 
4.3栈的抽象数据类型        91 
4.4栈的顺序存储结构及实现        92 
4.4.1栈的顺序存储结构        92 
4.4.2栈的顺序存储结构进栈操作        93 
4.4.3栈的顺序存储结构出栈操作        94 
4.5两栈共享空间        94 
两个大学室友毕业同时到北京工作，他们都希望租房时能找到独自住的一室户或一室一厅，可找来找去发现，实在是承受不起。 
4.6栈的链式存储结构及实现        97 
4.6.1栈的链式存储结构        97 
4.6.2栈的链式存储结构进栈操作        98 
4.6.3栈的链式存储结构出栈操作        99 
4.7栈的作用        100 
4.8栈的应用——递归        100 
当你往镜子前面一站，镜子里面就有一个你的像。但你试过两面镜子一起照吗？如果a、b两面镜子相互面对面放着，你往中间一站，嘿，两面镜子里都有你的千百个“化身”。 
4.8.1斐波那契数列实现        101 
4.8.2递归定义        103 
4.9栈的应用——四则运算表达式求值        104 
4.9.1后缀（逆波兰）表示法定义        104 
4.9.2后缀表达式计算结果        106 
4.9.3中缀表达式转后缀表达式        108 
4.10队列的定义        111 
电脑有时会处于疑似死机的状态。就当你失去耐心，打算了reset时。突然它像酒醒了一样，把你刚才点击的所有操作全部都按顺序执行了一遍。 
4.11队列的抽象数据类型        112 
4.12循环队列        113 
你上了公交车发现前排有两个空座位，而后排所有座位都已经坐满，你会怎么做？立马下车，并对自己说，后面没座了，我等下一辆？没这么笨的人，前面有座位，当然也是可以坐的。 
4.12.1队列顺序存储的不足        112 
4.12.2循环队列定义        114 
4.13队列的链式存储结构及实现        117 
4.13.1队列链式存储结构入队操作118 
4.13.2队列链式存储结构出队操作        119 
4.14总结回顾        120 
4.15结尾语        121 
人生，需要有队列精神的体现。南极到北极，不过是南纬90度到北纬90度的队列，如果你中途犹豫，临时转向，也许你就只能和企鹅相伴永远。可事实上，无论哪个方向，只要你坚持到底，你都可以到达终点。 
第5章串        123 
5.1开场白        124 
“枯眼望遥山隔水，往来曾见几心知？壶空怕酌一杯酒，笔下难成和韵诗。途路阻人离别久，讯音无雁寄回迟。孤灯夜守长寥寂，夫忆妻兮父忆儿。”……可再仔细一读发现，这首诗竟然可以倒过来读。 
5.2串的定义        124 
我所提到的“over”、“end”、“lie”其实就是“lover”、“friend”、“believe”这些单词字符串的子串。 
5.3串的比较        126 
5.4串的抽象数据类型        127 
5.5串的存储结构        128 
感情上发生了问题，为了向女友解释一下，我准备发一条短信，一共打了75个字。最后八个字是“我恨你是不可能的”，点发送。后来得知对方收到的，只有70个字，短信结尾是“……我恨你”。 
5.5.1串的顺序存储结构        129 
5.5.2串的链式存储结构        131 
5.6朴素的模式匹配算法        131 
主串为s=”00000000000000000000000000000000000000000000000001”，而要匹配的子串为t=”0000000001”，……在匹配时，每次都得将t中字符循环到最后一位才发现，哦，原来它们是不匹配的。 
5.7kmp模式匹配算法        135 
很多年前我们的科学家觉得像这种有多个0和1重复字符的字符串，却需要挨个遍历的算法，是非常糟糕的事情。 
5.7.1kmp模式匹配算法原理        135 
5.7.2next数组值推导        139 
5.7.3kmp模式匹配算法实现        141 
5.7.4kmp模式匹配算法改进        142 
5.7.5nextval数组值推导        144 
5.8总结回顾        146 
5.9结尾语        146 
《璇玑图》共八百四十字，纵横各二十九字，纵、横、斜、交互、正、反读或退一字、迭一字读均可成诗，诗有三、四、五、六、七言不等，目前有人统计可组成七千九百五十八首诗。听清楚哦，是7958首。 
第6章树        149 
6.1开场白        150 
无论多高多大的树，那也是从小到大的，由根到叶，一点点成长起来的。俗话说十年树木，百年树人，可一棵大树又何止是十年这样容易。 
6.2树的定义        150 
树的定义其实就是我们在讲解栈时提到的递归的方法。也就是在树的定义之中还用到了树的概念，这是比较新的一种定义方法。 
6.2.1结点分类        152 
6.2.2结点间关系        152 
6.2.3树的其他相关概念        153 
6.3树的抽象数据类型        154 
6.4树的存储结构        155 
6.4.1双亲表示法        155 
6.4.2孩子表示法        158 
6.4.3孩子兄弟表示法        162 
6.5二叉树的定义        163 
苏东坡曾说：“人有悲欢离合，月有阴晴圆缺，此事古难全”。意思就是完美是理想，不完美才是人生。我们通常举的例子也都是左高右低、参差不齐的二叉树。那是否存在完美的二叉树呢？ 
6.5.1二叉树特点        164 
6.5.2特殊二叉树        166 
6.6二叉树的性质        169 
6.6.1二叉树性质1        169 
6.6.2二叉树性质2        169 
6.6.3二叉树性质3        169 
6.6.4二叉树性质4        170 
6.6.5二叉树性质5        171 
6.7二叉树的存储结构        172 
6.7.1二叉树顺序存储结构        172 
6.7.2二叉链表        173 
6.8遍历二叉树        174 
你人生的道路上，高考填志愿要面临哪个城市、哪所大学、具体专业等选择，由于选择方式的不同，遍历的次序就完全不同。 
6.8.1二叉树遍历原理        174 
6.8.2二叉树遍历方法        175 
6.8.3前序遍历算法        178 
6.8.4中序遍历算法        181 
6.8.5后序遍历算法        184 
6.8.6推导遍历结果        184 
6.9二叉树的建立        187 
6.10线索二叉树        188 
我们现在提倡节约型社会，一切都应该节约为本。对待我们的程序当然也不例外，能不浪费的时间或空间，都应该考虑节省。 
6.10.1线索二叉树原理        188 
6.10.2线索二叉树结构实现        191 
6.11树、森林与二叉树的转换        195 
有个乡镇企业也买了同样的生产线，老板发现这个问题后找了个小工来说：你必须搞定，不然炒你鱿鱼。小工很快想出了办法：他在生产线旁边放了台风扇猛吹，空皂盒自然会被吹走。 
6.11.1树转换为二叉树        196 
6.11.2森林转换为二叉树        197 
6.11.3二叉树转换为树        197 
6.11.4二叉树转换为森林        199 
6.11.5树与森林的遍历        199 
6.12赫夫曼树及其应用        200 
压缩而不出错是如何做到的呢？简单的说，就是把我们要压缩的文本进行重新编码，以达到减少不必要的空间的技术。压缩和解压缩技术就是基于赫夫曼的研究之上发展而来，我们应该记住他。
6.12.1赫夫曼树        200 
6.12.2赫夫曼树定义与原理        203 
6.12.3赫夫曼编码        205 
6.13总结回顾        208 
6.14结尾语        209 
人受伤时会流下泪水。树受伤时，天将再不会哭。希望我们的未来不要仅仅是钢筋水泥建造的高楼，也要有那郁郁葱葱的森林和草地，我们人类才可能与自然和谐共处。 
第7章图        211 
7.1开场白        212 
如果你不善于规划，很有可能就会出现如玩好新疆后到海南，然后再冲向黑龙江这样的荒唐决策。 
7.2图的定义        213 
现实中，人与人之间关系就非常复杂，比如我的认识的朋友，可能他们之间也互相认识，这就不是简单的一对一、一对多的关系了，那就是我们今天要研究的主题——图。 
7.2.1各种图定义        214 
7.2.2图的顶点与边间关系        217 
7.2.3连通图相关术语        219 
7.2.4图的定义与术语总结        222 
7.3图的抽象数据类型        222 
7.4图的存储结构        223 
因为美国的黑夜就是中国的白天，利用互联网，他的员工白天上班就可以监控到美国仓库夜间的实际情况，如果发生了像火灾、偷盗这样的突发事件，及时电话到美国当地相关人员处理 
7.4.1邻接矩阵        224 
7.4.2邻接表        228 
7.4.3十字链表        232 
7.4.4邻接多重表        234 
7.4.5边集数组        236 
7.5图的遍历        237 
我有一天早晨准备出门，发现钥匙不见了。一定是我儿子拿着玩，不知道丢到哪个犄角旮旯去了，你们说，我应该如何找？ 
7.5.1深度优先遍历        238 
7.5.2广度优先遍历        242 
7.6最小生成树        245 
如果你加班加点，没日没夜设计出的结果是方案一，我想你离被炒鱿鱼应该是不远了（同学微笑）。因为这个方案比后两个方案一半还多的成本会让老板气晕过去的。 
7.6.1普里姆（prim）算法        247 
7.6.2克鲁斯卡尔（kruskal）算法        251 
7.7最短路径        257 
有人为了省钱，需路程最短，但换乘站间距离长等原因并不省时间；另一些人，他为赶时间，最大的需求是总时间要短；还有一类人，他们都不想多走路，关键是换乘要少，这样可以在车上好好休息一下。 
7.7.1迪杰斯特拉（dijkstra）算法        259 
7.7.3弗洛伊德（floyd）算法        265 
7.8拓扑排序        270 
电影制作不可能在人员到位进驻场地时，导演还没有找到，也不可能在拍摄过程中，场地都没有。这都会导致荒谬的结果。 
7.8.1拓扑排序介绍        271 
7.8.2拓扑排序算法        272 
7.9关键路径        277 
假如造一个轮子要0.5天、造一个发动机要3天、造一个车底盘要2天、造一个外壳要2天，其它零部件2天，全部零部件集中到一处要0.5天，组装成车要2天，请问，在汽车厂造一辆车，最短需要多少天呢？ 
7.9.1关键路径算法原理        279 
7.9.2关键路径算法        280 
7.10总结回顾        287 
7.11结尾语        289 
世界上最遥远的距离，不是牛a与牛c之间狭小空隙，而是你们当中，有人在通往牛逼的路上一路狂奔，而有人步入大学校园就学会放弃。 
第8章查找        291 
8.1开场白        292 
当你精心写了一篇博文或者上传一组照片到互联网上，来自世界各地的无数“蜘蛛”便会蜂拥而至。所谓蜘蛛就是搜索引擎公司服务器上软件，它把互联网当成了蜘蛛网，没日没夜的访问上面的各种信息。 
8.2查找概论        293 
比如网络时代的新名词，如“蜗居”、“蚁族”等，如果需要将它们收录到汉语词典中，显然收录时就需要查找它们是否存在，以及找到如果不存在时应该收录的位置。 
8.3顺序表查找        295 
8.3.1顺序表查找算法        296 
8.3.2顺序表查找优化        297 
8.4有序表查找        298 
我在纸上已经写好了一个100以内的正整数请你猜，问几次可以猜出来。当时已经介绍了如何才可以最快的猜出这个数字。我们把这种每次取中间记录查找的方法叫做折半查找。 
8.4.1折半查找        298 
8.4.2插值查找        301 
8.4.3斐波那契查找        302 
8.5线性索引查找        306 
我母亲年纪大了，经常在家里找不到东西，于是她用一小本子，记录了家里所有小东西放置的位置，比如户口本放在右手床头柜下面抽屉中，钞票放在衣……咳，这个就不提了。 
8.5.1稠密索引        307 
8.5.2分块索引        308 
8.5.3倒排索引        311 
8.6二叉排序树        313 
后来老虎来了，一人拼命地跑，另一人则急中生智，爬到了树上。而老虎是不会爬树的，结果……。爬树者改变了跑的思想，这一改变何等重要，捡回了自己的一条命。 
8.6.1二叉排序树查找操作        316 
8.6.2二叉排序树插入操作        318 
8.6.3二叉排序树删除操作        320 
8.6.4二叉排序树总结        327 
8.7平衡二叉树（avl树）        328 
平板就是一个世界，当诱惑降临，人心中的平衡被打破，世界就会混乱，最后留下的只有孤独寂寞失败。这种单调的机械化的社会，禁不住诱惑的侵蚀，最容易被侵蚀的，恰恰是最空虚的心灵。
8.7.1平衡二叉树实现原理        330 
8.7.2平衡二叉树实现算法        334 
8.8多路查找树（b树）        341 
要观察一个公司是否严谨，看他们如何开会就知道了。如果开会时每一个人都只是带一张嘴，即兴发言，这肯定是一家不严谨的公司。 
8.8.12-3树        343 
8.8.22-3-4树        348 
8.8.3b树        349 
8.8.4b+树        351 
8.9散列表查找（哈希表）概述        353 
你很想学太极拳，听说学校有个叫张三丰的人打得特别好，于是到学校学生处找人，工作人员拿出学生名单，最终告诉你，学校没这个人，并说张三丰几百年前就已经在武当山作古了。 
8.9.1散列表查找定义        354 
8.9.2散列表查找步骤        355 
8.10散列函数的构造方法        356 
8.10.1直接定址法        357 
8.10.2数字分析法        358 
8.10.3平方取中法        359 
8.10.4折叠法        359 
8.10.5除留余数法        359 
8.10.6随机数法        360 
8.11处理散列冲突的方法        360 
我们每个人都希望身体健康，虽然疾病可以预防，但不可避免，没有任何人可以说，生下来到现在没有生过一次病。 
8.11.1开放定址法        361 
8.11.2再散列函数法        363 
8.11.3链地址法        363 
8.11.4公共溢出区法        364 
8.12散列表查找实现        365 
8.12.1散列表查找算法实现        365 
8.12.2散列表查找性能分析        367 
8.13总结回顾        368 
8.14结尾语        369 
如果我是个喜欢汽车的人，时常搜汽车信息。那么当我在搜索框中输入“甲壳虫”、“美洲虎”等关键词时，不要让动物和人物成为搜索的头条。 
第9章排序        373 
9.1开场白        374 
假如我想买一台iphone4的手机，于是上了某电子商务网站去搜索。可搜索后发现，有8863个相关的物品，如此之多，这叫我如何选择。我其实是想买便宜一点的，但是又怕遇到骗子，想找信誉好的商家，如何做？ 
9.2排序的基本概念与分类        375 
比如我们某些大学为了选拔在主科上更优秀的学生，要求对所有学生的所有科目总分倒序排名，并且在同样总分的情况下将语数外总分做倒序排名。这就是对总分和语数外总分两个次关键字的组合排序。 
9.2.1排序的稳定性        376 
9.2.2内排序与外排序        377 
9.2.3排序用到的结构与函数        378 
9.3冒泡排序        378 
无论你学习哪种编程语言，在学到循环和数组时，通常都会介绍一种排序算法，而这个算法一般就是冒泡排序。并不是它的名称很好听，而是说这个算法的思路最简单，最容易理解。 
9.3.1最简单排序实现        379 
9.3.2冒泡排序算法        380 
9.3.3冒泡排序优化        382 
9.3.4冒泡排序复杂度分析        383 
9.4简单选择排序        384 
还有一种做股票的人，他们很少出手，只是在不断观察和判断，等时机一到，果断买进或卖出。他们因为冷静和沉着，以及交易的次数少，而最终收益颇丰。 
9.4.1简单选择排序算法        384 
9.4.2简单选择排序复杂度分析        385 
9.5直接插入排序        386 
哪怕你是第一次玩扑克牌，只要认识这些数字，理牌的方法都是不用教的。将3和4移动到5的左侧，再将2移动到最左侧，顺序就算是理好了。这里，我们的理牌方法，就是直接插入排序法。 
9.5.1直接插入排序算法        386 
9.5.2直接插入排序复杂度分析        388 
9.6希尔排序        389 
不管怎么说，希尔排序算法的发明，使得我们终于突破了慢速排序的时代（超越了时间复杂度为o(n2)），之后，更为高效的排序算法也就相继出现了。 
9.6.1希尔排序原理        391 
9.6.2希尔排序算法        391 
9.6.3希尔排序复杂度分析        395 
9.7堆排序        396 
什么叫堆结构呢？回忆一下我们小时候，特别是男同学，基本都玩过叠罗汉的恶作剧。通常都是先把某个要整的人按倒在地，然后大家就一拥而上扑了上去……后果？后果当然就是一笑了之。 
9.7.1堆排序算法        398 
9.7.2堆排序复杂度分析        405 
9.8归并排序        406 
即使你是你们班级第一、甚至年级第一名，如果你没有上分数线，则说明你的成绩排不到全省前1万名，你也就基本失去了当年上本科的机会了。 
9.8.1归并排序算法        407 
9.8.2归并排序复杂度分析        413 
9.8.3非递归实现归并排序        413 
9.9快速排序        417 
终于我们的高手要登场了，将来你工作后，你的老板让你写个排序算法，而你会的算法中竟然没有快速排序，我想你还是不要声张，偷偷去把快速排序算法找来敲进电脑，这样至少你不至于被大伙儿取笑。 
9.9.1快速排序算法        417 
9.9.2快速排序复杂度分析        421 
9.9.3快速排序优化        422 
9.10总结回顾        428 
目前还没有十全十美的排序算法，有优点就会有缺点，即使是快速排序法，也只是在整体性能上优越，它也存在排序不稳定、需要大量辅助空间、对少量数据排序无优势等不足。 
9.11结尾语        430 
如果你有梦想的话，就要去捍卫它。当别人做不到的时候，他们就想要告诉你，你也不能。如果你想要些什么，就得去努力争取。就这样！ 
附录参考文献        435