随笔分类 -  大话数据结构

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

posted @ 2011-04-19 22:22 伍迷 阅读(17263) 评论(14) 推荐(15) 编辑

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

posted @ 2011-04-19 09:54 伍迷 阅读(8733) 评论(15) 推荐(10) 编辑

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

posted @ 2011-04-18 10:01 伍迷 阅读(6727) 评论(7) 推荐(1) 编辑

《大话数据结构》第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 伍迷 阅读(4567) 评论(8) 推荐(5) 编辑

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

posted @ 2011-04-15 08:42 伍迷 阅读(3315) 评论(4) 推荐(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 伍迷 阅读(2890) 评论(4) 推荐(2) 编辑

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

posted @ 2011-04-14 14:45 伍迷 阅读(2337) 评论(0) 推荐(1) 编辑

《大话数据结构》第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 伍迷 阅读(4495) 评论(13) 推荐(6) 编辑

《大话数据结构》第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 伍迷 阅读(7011) 评论(17) 推荐(7) 编辑

《大话数据结构》第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 伍迷 阅读(6637) 评论(18) 推荐(10) 编辑

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

posted @ 2011-02-24 14:30 伍迷 阅读(7183) 评论(15) 推荐(6) 编辑

《大话数据结构》第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 伍迷 阅读(7121) 评论(21) 推荐(10) 编辑

导航