大话数据结构

技术文章如何写作才能有较好的阅读体验
摘要: 好的技术文章,是让符合阅读条件的读者,在良好阅读体验的情况下,看懂学会甚至掌握文章要传达的信息。如果你的写作是为了分享,那么一定要时刻考虑你的读者,有了这样的心态,不愁写不好技术文章。阅读全文

posted @ 2012-03-15 00:01 伍迷 阅读(5093) | 评论 (44) 编辑

•《大话数据结构》获中国书刊发行业协会评选的“2011年度全行业优秀畅销品种”
摘要: 刚刚得知,在出版社内部的评奖活动中,我去年写作出版的图书《大话数据结构》获中国书刊发行业协会评选的“2011年度全行业优秀畅销品种”。这是本书的第一个获奖,贴上来小虚荣一下。另外本书第四次印刷马上开始,将会修正前三次印刷发现的所有错误,感谢众位读者的认可和支持,我会继续努力。阅读全文

posted @ 2012-02-14 16:25 伍迷 阅读(615) | 评论 (2) 编辑

《大话数据结构》简体中文版第三次印刷后勘误
摘要: 《大话数据结构》第三次印刷已经修正了大部分此前的错误,但还是遗留了部分,希望购买的读者能够首先更新勘误中的错误后再阅读。给您带来了不便,抱歉!阅读全文

posted @ 2012-01-09 09:22 伍迷 阅读(1901) | 评论 (32) 编辑

转帖:希望伍迷开创一个大话时代——《大话数据结构》读者书评
摘要: 这位豆瓣的读者文字很棒,既写到了买书的原因,也通过举书中的例子提到了本书的特点。面对如此褒奖,伍迷也有些飘飘然起来,淡定淡定,一切又将重新开始!阅读全文

posted @ 2011-07-11 22:44 伍迷 阅读(2672) | 评论 (9) 编辑

转帖:算法好学吗?——《大话数据结构》读者书评
摘要: 陈钢同学是我的朋友,在我写作时给予了我很多帮助。此评论写得相当客观,并没有夸大地说好话,而是强调了《大话数据结构》仅仅只是数据结构与算法学习的起步而已。我转帖出来,也是希望读者可以了解,算法要学好,可真不是几日之功。我们都需要不断努力!阅读全文

posted @ 2011-07-11 22:39 伍迷 阅读(2646) | 评论 (6) 编辑

《大话数据结构》样章试读
摘要: 本应该直接贴出正文,但考虑到图片过多和排版格式较为复杂,为了能够原汁原味的体现原书风貌,所以就提供PDF文档下载阅读。阅读全文

posted @ 2011-07-04 14:05 伍迷 阅读(7757) | 评论 (51) 编辑

《大話資料結構》繁體中文版勘誤
摘要: 时常更新,请购买图书的读者关注!阅读全文

posted @ 2011-06-26 17:26 伍迷 阅读(1212) | 评论 (5) 编辑

《大话数据结构》简体中文版勘误
摘要: 时常更新,请购买图书的读者关注!阅读全文

posted @ 2011-06-26 17:26 伍迷 阅读(7726) | 评论 (220) 编辑

《大话数据结构》目录
摘要: 由于目录中有比较复杂的格式,所以只能用PDF的形式提供。http://files.cnblogs.com/cj723/%E7%9B%AE%E5%BD%95.pdf阅读全文

posted @ 2011-06-03 11:59 伍迷 阅读(2579) | 评论 (0) 编辑

《大话数据结构》前言
摘要: 前 言本书起因 大家好!我是《大话设计模式》(2008年初出版)的作者,三年来,承蒙广大读者的厚爱,《大话设计模式》取得了较大的成功。仅在当当网,截止本文写作时,就已经有1073次评论,705次5星评价,位居五星图书榜计算机/网络类的累计总榜第二名。此书已经成为国内原创计算机类图书最畅销的书籍之一。 对于这样一个自己喜欢做、可以做得好,而且已经得到了市场广泛认可,为很多朋友提供帮助的事情,我没有理由不去继续做下去。这就是我准备再写书的原因。 我曾做过调查,数据结构的学习者大多都有这样的感慨:数据结构很重要,一定要学好,但数据结构比较抽象,有些算法理解起来很困难,学得很累。可我更希望传达这样的信阅读全文

posted @ 2011-06-01 11:10 伍迷 阅读(2836) | 评论 (15) 编辑

《大话数据结构》第9章 排序 9.10 总结回顾
摘要: 我们生命中,矛盾和困惑往往一直伴随。很多同学来学习数据结构,其实并不是真的明白它的重要性,通常只是因为学校开了这门课,而不得不来这里弄个PASS,过后,真到需要用时,却发现力不从心而追悔莫及。尽管现在是课程的最后,对于个别没有重视这门课的同学来说有些晚了,我还是想再亡羊补牢:数据结构和算法对于程序员的职业人生来说,那就是两个圆圈的交集部分,用心去掌握它,你的编程之路将会是坦途。阅读全文

posted @ 2011-04-29 17:34 伍迷 阅读(3040) | 评论 (17) 编辑

《大话数据结构》第9章 排序 9.9 快速排序(下)
摘要: 我们现在学过的排序算法,有按照实现方法分类命名的,如简单选择排序、直接插入排序、归并排序,有按照其排序的方式类比现实世界命名的,比如冒泡排序、堆排序,还有用人名命名的,比如希尔排序。但是刚才我们讲的排序,却用“快速”来命名,这也就意味着只要再有人找到更好的排序法,此“快速”就会名不符实,不过,至少今天,TonyHoare发明的快速排序法经过多次的优化后,在整体性能上,依然是排序算法王者。我们应该要好好研究并掌握它。阅读全文

posted @ 2011-04-28 09:06 伍迷 阅读(2922) | 评论 (11) 编辑

《大话数据结构》第9章 排序 9.9 快速排序(上)
摘要: 9.9.1快速排序介绍 终于我们的高手要登场了,如果将来你工作后,你的老板要让你写个排序算法,而你会的算法中竟然没有快速排序,我想你还是不要声张,偷偷去把快速排序算法找来敲进电脑,这样至少你不至于被大伙儿取笑。 事实上,不论是C++ STL、Java SDK或者.NET FrameWork SDK等开发工具包中的源代码里都能找到它的某种实现版本。 快速排序算法最早由图灵奖获得者Tony Hoare设计出来的,他在形式化方法理论,以及ALGOL60 编程语言的发明都有卓越的贡献,是上世纪最伟大的计算机科学家之一。而这快速排序算法只是他众多贡献中的一个小发明而已。 更牛的是,我们现在要学习的这个快阅读全文

posted @ 2011-04-27 09:10 伍迷 阅读(3129) | 评论 (7) 编辑

《大话数据结构》第9章 排序 9.8 归并排序(下)
摘要: 9.8.3归并排序复杂度分析 我们来分析一下归并排序的时间复杂度,一趟归并需要将SR[1]~SR[n]中相邻的长度为h的有序序列进行两两归并。并将结果放到TR1[1]~TR1[n]中,这需要将待排序序列中的所有记录扫描一遍,因此耗费O(n)时间,而由完全二叉树的深度可知,整个归并排序需要进行⌈log2n⌉趟,因此,总的时间复杂度为O(nlogn),而且这是归并排序算法中最好、最坏、平均的时间性能。 由于归并排序在归并过程中需要与原始记录序列同样数量的存储空间存放归并结果以及递归时深度为log2n的栈空间,因此空间复杂度为O(n+logn)。 另外,对代码进行仔细研究,发现Merge函数中有if阅读全文

posted @ 2011-04-26 08:12 伍迷 阅读(2231) | 评论 (6) 编辑

《大话数据结构》第9章 排序 9.8 归并排序(上)
摘要: 9.8.1归并排序介绍 前面我们讲了堆排序,因为它用到了完全二叉树,充分利用了完全二叉树的深度是⌊log2n⌋+1的特性,所以效率比较高。不过堆结构的设计本身是比较复杂的,老实说,能想出这样的结构就挺不容易,有没有更直接简单的办法利用完全二叉树来排序呢?当然是有。 先来举一个例子。你们知道高考一本、二本、专科分数线是如何划分出来的吗? 简单地说,如果各高校本科专业在某省高三理科学生中计划招收1万名,那么将全省参加高考的理科学生分数倒排序,第1万名的总分数就是当年本科生的分数线(现实可能会比这复杂,这里简化之)。也就是说,即使你是你们班级第一、甚至年级第一名,如果你没有上分数线,则说明你的成绩排阅读全文

posted @ 2011-04-25 09:42 伍迷 阅读(2706) | 评论 (5) 编辑

《大话数据结构》第9章 排序 9.7 堆排序(下)
摘要: 9.7.2堆排序算法 堆排序(Heap Sort)就是利用堆(假设利用大顶堆)进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次小值。如此反复执行,便能得到一个有序序列了。 例如图9-7-4,左图是一个大顶堆,90为最大值,将90与20(末尾元素)互换,如中图所示,此时90就成了整个堆序列的最后一个元素,将20经过调整,使得除90以外的结点继续满足大顶堆定义(所有结点都大于等于其子孩子),见右图。然后再阅读全文

posted @ 2011-04-22 08:17 伍迷 阅读(2990) | 评论 (9) 编辑

《大话数据结构》第9章 排序 9.7 堆排序(上)
摘要: 9.7.1堆结构介绍 我们前面讲到简单选择排序,它在待排序的n个记录中选择一个最小的记录需要比较n-1次。本来这也可以理解,查找第一个数据需要比较这么多次正常的,否则如何知道它是最小的记录。 可惜的是,这样的操作并没有把每一趟的比较结果保存下来,在后一趟的比较中,有许多比较在前一趟已经做过了,但由于前一趟排序时未保存这些比较结果,所以后一趟排序时又重复执行了这些比较操作,因而记录的比较次数较多。如果可以做到每次在选择到最小的记录的同时,并根据比较对其他记录做出相应的调整,那样排序的总体效率就会非常高了。而堆排序(Heap Sort),就是对简单选择排序进行的一种改进,这种改进的效果是非常明显的阅读全文

posted @ 2011-04-21 21:56 伍迷 阅读(2432) | 评论 (6) 编辑

《大话数据结构》第9章 排序 9.6 希尔排序(下)
摘要: 9.6.3希尔排序算法 好了,为了能够真正弄明白希尔排序的算法,我们还是老办法——模拟计算机在执行算法时的步骤还研究算法到底是如何进行排序的。 希尔排序算法代码如下。1voidShellSort(SqList*L)2{3inti,j;4intincrement=L->length;5do6{7increment=increment/3+1;/*增量序列*/8for(i=increment+1;i<=L->length;i++)9{10if(L->r[i]<L->r[i-increment])/*需将L->r[i]插入有序增量子表*/11{12L->阅读全文

posted @ 2011-04-20 20:52 伍迷 阅读(2885) | 评论 (3) 编辑

《大话数据结构》第9章 排序 9.6 希尔排序(上)
摘要: 9.6.1变不可能为可能 给大家出一道智力题。请问“VII”是什么? 嗯,很好,它是罗马数字的7。现在我们要给它加上一笔,让它变成8(VIII),应该是非常简单,只需要在右侧加一竖线即可。 现在我请大家试着对罗马数字9,也就是“IX”增加一笔,把它变成6,应该怎么做? (几分钟后) 我已经听不少声音说,“这怎么可能!” 可为什么一定要用常规方法呢? 我这里有三种另类的方法可以实现它。 方法一:观察发现“X”其实可以看作是一个正放一个倒置两个“V”。因此我们,给“IX”中间加一条水平线,上下颠倒,然后遮住下面部分,也就是说,我们所谓的加上一笔就是遮住一部分,于是就得到“VI”。 方法二:在“IX阅读全文

posted @ 2011-04-19 22:22 伍迷 阅读(3932) | 评论 (13) 编辑

《大话数据结构》第9章 排序 9.5 直接插入排序
摘要: 9.5.1直接插入排序算法 扑克牌是我们几乎每个人都可能从事过的游戏。而最基本的扑克玩法都是一边摸牌,一边理牌。假如我们拿到了这样一手牌,如图9-5-1。啊,似乎是同花顺呀,别急,我们得理一理顺序才知道是否是真的同花顺。请问,如果是你,应该如何理牌呢? 应该说,哪怕你是第一次玩扑克牌,只要认识这些数字,理牌的方法都是不用教的。将3和4移动到5的左侧,再将2移动到最左侧,顺序就算是理好了。这里,我们的理牌方法,就是直接插入排序法。 直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。 顾名思义,从名阅读全文

posted @ 2011-04-19 09:54 伍迷 阅读(3217) | 评论 (15) 编辑

《大话数据结构》第9章 排序 9.4 简单选择排序
摘要: 9.4.1简单选择排序算法 爱炒股票短线的人,总是喜欢不断的买进卖出,想通过价差来实现盈利。但通常这种频繁操作的人,即使失误不多,也会因为操作的手续费和印花税过高而获利很少。还有一种做股票的人,他们很少出手,只是在不断的观察和判断,等到时机一到,果断买进或卖出。他们因为冷静和沉着,以及交易的次数少,而最终收益颇丰。 冒泡排序的思想就是不断的在交换,通过交换完成最终的排序,这和做股票短线频繁操作的人是类似的。我们可不可以像只有在时机非常明确到来时才出手的股票高手一样,也就是在排序时找到合适的关键字再做交换,并且只移动一次就完成相应关键字的排序定位工作呢?这就是选择排序法的初步思想。 选择排序的基阅读全文

posted @ 2011-04-18 10:01 伍迷 阅读(1963) | 评论 (6) 编辑

《大话数据结构》第9章 排序 9.3 冒泡排序(下)
摘要: 9.3.2冒泡排序算法 我们来看看正宗的冒泡算法,有没有什么改进的地方。/*对顺序表L作冒泡排序*/voidBubbleSort(SqList*L){inti,j;for(i=1;i<L->length;i++){for(j=L->length-1;j>=i;j--)/*注意j是从后往前循环*/{if(L->r[j]>L->r[j+1])/*若前者大于后者(注意这里与上一算法差异)*/{swap(L,j,j+1);/*交换L->r[j]与L->r[j+1]的值*/}}}} 依然假设我们待排序的关键字序列是{9,1,5,8,3,7,4,6,2阅读全文

posted @ 2011-04-15 11:41 伍迷 阅读(1712) | 评论 (8) 编辑

《大话数据结构》第9章 排序 9.3 冒泡排序(上)
摘要: 9.3.1最简单排序实现 无论你学习哪种编程语言,在学到循环和数组时,通常都会介绍一种排序算法来作为例子,而这个算法一般就是冒泡排序。并不是它的名称很好听,而是说这个算法的思路最简单,最容易理解。因此,哪怕大家可能都已经学过冒泡排序了,我们还是从这个算法开始我们的排序之旅。 冒泡排序(Bubble Sort)一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。冒泡的实现在细节上可以很多种变化,我们将分别就3种不同的冒泡实现代码,来讲解冒泡排序的思想。这里,我们就先来看看比较容易理解的一段。/*对顺序表L作交换排序(冒泡排序初级版)*/voidBubb阅读全文

posted @ 2011-04-15 08:42 伍迷 阅读(1524) | 评论 (3) 编辑

《大话数据结构》第9章 排序 9.2 排序的基本概念与分类
摘要: 9.2排序的基本概念与分类9.2.1排序的定义 排序是我们生活中经常会面对的问题。同学们做操时会按照从矮到高排列;老师查看上课出勤情况时,会按学生学号顺序点名;高考录取时,会按成绩总分降序依次录取等。那排序的严格定义是什么呢? 假设含有n个记录的序列为{r1,r2,……,rn},其相应的关键字分别为{k1,k2,……,kn},需确定1,2,……,n的一种排列p1,p2,……,pn,使其相应的关键字满足kp1≤kp2≤……≤kpn(非递减或非递增)关系,即使得序列成为一个按关键字有序的序列{rp1,rp2,……,rpn},这样的操作就称为排序。 注意我们在排序问题中,通常将数据元素称为记录。显然阅读全文

posted @ 2011-04-14 15:16 伍迷 阅读(1453) | 评论 (2) 编辑

《大话数据结构》第9章 排序 9.1 开场白
摘要: 9.1开场白大家好!你们有没有在网上买过东西啊? 嗯?居然还有人说没有。呵呵,在座的都是大学生,应该很多同学都有过网购的经历。哪怕真的没有,也看到或听到过一些。现在网上购物已经相对成熟,对用户来说还是带来了很大的方便。假如我想买一台iphone4的手机,于是上了某电子商务网站去搜索。可搜索后发现(如图9-1-1),有8863个相关的物品,如此之多,这叫我如何选择。我其实是想买便宜一点的,但是又怕遇到骗子,想找信誉好的商家,如何做? 下面的有些购物达人给我出主意了,排序呀。对呀,排序就行了(如图9-1-2所示)。我完全可以根据自己的需要对搜索到的商品进行排序,比如按信用从高到低、再按价格从低到高阅读全文

posted @ 2011-04-14 14:45 伍迷 阅读(1321) | 评论 (0) 编辑

《大话数据结构》第3章 线性表 3.8.2 单链表的删除
摘要: 3.8.2单链表的删除 现在我们再来看单链表的删除。设存储元素ai的结点为q,要实现将结点q删除单链表的操作,其实就是将它的前继结点的指针绕过,指向它的后继结点即可(如图3-8-5所示)。 我们所要做的,只是实际上就是一步,p->next=p->next->next,用q来取代p->next,即是q=p->next; p->next=q->next; 解读这两句代码,也就是说让p的后继的后继结点改成p的后继结点。有点拗口呀,那我再打个形象的比方。本来是爸爸左牵着妈妈的手,右牵着宝宝的手在马路边散步。突然迎面走来一美女,爸爸一下子看呆了,此情景被妈妈逮个阅读全文

posted @ 2011-03-07 10:29 伍迷 阅读(2107) | 评论 (9) 编辑

《大话数据结构》第2章 算法基础 2.9 算法的时间复杂度
摘要: 2.9 算法的时间复杂度2.9.1算法时间复杂度定义 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n) = O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。 这样用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。 一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。 显然,由此算法时间复杂度的定义可知,我们的三个求和算法的时间复杂度分别阅读全文

posted @ 2011-03-05 16:13 伍迷 阅读(2990) | 评论 (17) 编辑

《大话数据结构》第2章 算法基础 2.8 函数的渐近增长
摘要: 2.8 函数的渐近增长我们现在来判断一下,两个算法A和B哪个更好。假设两个算法的输入规模都是n,算法A要做2n + 3次操作,你可以理解为先有一个n次的循环,执行完成后,再有一个n次循环,最后有三次赋值或运算,共2n + 3次操作。算法B要做3n + 1次操作。你觉得它们谁更快呢? 准确说来,答案是不一定的(如表2-8-1所示)。 当n = 1时,算法A效率不如算法B(次数比算法B要多一次)。而当n = 2时,两者效率相同;当n > 2时,算法A就开始优于算法B了,随着n的增加,算法A要越来越好过算法B了(执行的次数比B要少)。于是我们可以得出结论,算法A总体上要好过算法B。 此时我们给阅读全文

posted @ 2011-03-05 15:24 伍迷 阅读(4180) | 评论 (18) 编辑

《大话数据结构》第1章 数据结构绪论 1.2 你数据结构怎么学的?
摘要: 1.2 你数据结构怎么学的? 早先我有一个学生叫蔡遥,绰号“小菜”。他前段时间一直通过E-mail与我交流,其中说起了他工作的一些经历,感慨万千。我在这里就讲讲小菜的故事。 他告诉我,在做我学生时,其实根本就没好好学数据结构,时常逃课,考试也是临时突击后勉强及格。毕业后,他几经求职,算是找到了一份程序员的工作。 工作中,有一次他们需要开发一个客服电话系统的项目,他们项目经理安排小菜完成客户排队模块的代码工作。 小菜觉得这个很容易,用数据库设计了一张客户排队表,并且用一个自动递增的整型数字作为客户的编号。只要来一个客户,就给这张表的末尾插入一条数据。等客服系统一有空闲,就从这张表中取出最小编号的阅读全文

posted @ 2011-02-24 14:30 伍迷 阅读(4259) | 评论 (14) 编辑

《大话数据结构》第1章 数据结构绪论 1.1 开场白
摘要: 1.1开场白 If you give someone a program, you will frustrate them for a day; if you teach them how to program, you will frustrate them for a lifetime. (如果你交给某人一个程序,你将折磨他一整天;如果你教某人如何编写程序,你将折磨他一辈子。) 而我可能就是要折磨你们一辈子的那个人。大家好!我是《数据结构》这门课的老师,我叫封清扬。同学私下里都叫我“疯子”,嘿嘿,疯子可是有思想的标志哦。 在座的大家给我面子,都来选修我的课,这点我很高兴。不过在上课前,有些阅读全文

posted @ 2011-02-24 14:27 伍迷 阅读(4129) | 评论 (21) 编辑