2011年4月26日

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

2011年4月25日

《大话数据结构》第9章 排序 9.8 归并排序(上)

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

posted @ 2011-04-25 09:42 伍迷 阅读(6538) 评论(7) 推荐(8) 编辑

2011年4月22日

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

2011年4月21日

《大话数据结构》第9章 排序 9.7 堆排序(上)

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

posted @ 2011-04-21 21:56 伍迷 阅读(7501) 评论(6) 推荐(5) 编辑

2011年4月20日

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

2011年4月19日

《大话数据结构》第9章 排序 9.6 希尔排序(上)

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

posted @ 2011-04-19 22:22 伍迷 阅读(17257) 评论(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 伍迷 阅读(8705) 评论(15) 推荐(10) 编辑

2011年4月18日

《大话数据结构》第9章 排序 9.4 简单选择排序

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

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

2011年4月15日

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

《大话数据结构》第9章 排序 9.3 冒泡排序(上)

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

posted @ 2011-04-15 08:42 伍迷 阅读(3311) 评论(4) 推荐(3) 编辑

2011年4月14日

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

《大话数据结构》第9章 排序 9.1 开场白

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

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

2011年3月7日

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

2011年3月5日

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

2011年2月24日

《大话数据结构》第1章 数据结构绪论 1.2 你数据结构怎么学的?

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

posted @ 2011-02-24 14:30 伍迷 阅读(7177) 评论(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 伍迷 阅读(7112) 评论(21) 推荐(10) 编辑

2011年2月8日

交互设计的学习体会分享

摘要: 在博客园中的朋友,大多是技术工作者,于是更多地是关注技术的问题,而忽略了我们设计开发软件,特别是应用软件和互联网产品的目的是为了更好的服务普通用户。换句话说,我们都应该要补一补关于交互设计的知识,以便于我们在设计软件时,不要太过于以技术人为主导思维,犯一些看似很合理,但其实普通用户会觉得很不爽的事情。本文中的观点主要来自于交互名著《About Face 2》,并加入了很多自己的体会。希望可以对大家有所帮助。 阅读全文

posted @ 2011-02-08 23:40 伍迷 阅读(8898) 评论(43) 推荐(18) 编辑

2011年2月6日

新浪微博产品交互改进之我见

摘要: 本文主要是针对当前国内最热门的微博产品“新浪微博”提出一些个人使用后的改进建议,算是一种对“交互设计”研究的分享。 阅读全文

posted @ 2011-02-06 16:11 伍迷 阅读(6287) 评论(41) 推荐(8) 编辑

2010年9月4日

伍迷七八月新浪微博集锦

摘要: 新浪微博节选 阅读全文

posted @ 2010-09-04 08:50 伍迷 阅读(1439) 评论(4) 推荐(2) 编辑

导航