数据结构复习笔记(4)

1, 归并排序无论初始序列如何排列,记录的比较次数不会受到影响,都是O(nlogn),但会影响到记录的移动次数,初始序列为正序时,记录移动次数为0,为逆序时,记录移动次数最大。

2, 若在1000000个记录中找出两个最小的记录,应该用什么排序方法所需要的关键字比较次数最少,是多少?

解:用堆排序方法。从n个记录中找出最小的记录,至少要n-1次,而将这n个记录构造成一个堆后,在[logn]个失败者中继续找出优胜者只需要再作[logn]-1次比较就可以了。所以,比较次数为:n+[logn]-2

3, 对50个整数进行快速排序,需要关键字间进行比较的次数的最小值和最大值是多少?

解:初始记录有序或基本有序时,快速排序蜕化为起泡排序,比较次数最大。若每次都分割成长度相等或长度仅相差1的子序列时,比较次数最小。而每次划分所进行比较的次数是该子序列中关键字个数减1,因此通过快速排序的判定树可以求出总比较次数。

最大比较次数:49+48+。。。+1=1225

最小比较次数:

49+23+24+10+11+11+11+4+4+4+5+4+5+4+5+1+1+1+1+1+1+1+2+1+1+1+2+1+1+1+2=193

4, 当n=7时,快速排序最好情况下要多少次比较?给出一个实例。最坏情况下要多少次比较?给出一个实例。

解:(1)最好情况下,每一趟快速排序后都能够划分出左右两个相等的区间,即设长度为n=2*k-1,则第一趟快排后划分得到两个长度都是n/2的子表,第二次快排后得到4个n/4的子表,。。。总共需要进行k=log(n+1)次划分,当子表长度为1时排序结束。因此,当n=7时,k=3.也就是说最好情况下第一个元素由两头向中间扫描到正中位置,就是说需要和其余6个元素都进行比较后找到最终位置,所以需要比较6次。第二趟分别对左,右两个子表(长度都是3,即k=2)进行排序,也就是需要与子表中其余2个元素进行比较,所以两个子表要比较4次,并且划分出的子表长度都为1,所以排序结束。所以共需要比较10次。实例:4,7,5,6,3,1,2

(2)最坏情况,每趟用来划分的基准元素总是定位于表的第一个位置或最后一个位置,这样划分出的左,右子表一个长度为0,另一个长度是原表长度减1,就退化为起泡排序,所以比较次数为6+5+4+3+2+1=21次。实例:1,2,3,4,5,7或7,6,5,4,3,2,1

5, 若只想得到1000个元素组成的序列中第5个最小元素之前的部分排序的序列,用什么方法最快?(1)起泡 (2)快速 (3)希尔 (4)堆排序 (5)简单选择

答:快速排序。它可以每次对第一个子序列进行划分,直到子序列长度小于等于4,若长度不足4,则对第二个子序列划分出相应长度的子序列就行了。

 

6,  对任意的7个关键字进行排序,至少要进行多少次关键字之间的两两比较?

答:任何一个借助“比较”进行排序的算法,在最坏情况下需要进行的比较次数至少为[log(n!)],所以要进行15次。 

7, 非递归的归并排序的运行时间:(1)n个数据全部有序。(2)n个数据全部逆向有序。(3)随机输入n个数据。

答:数据比较次数与初始序列无关,而移动次数与初始序列有关。

(1)比较次数O(nlogn),移动次数0。(2)比较次数O(nlogn),移动次数O(nlogn)。

(3)比较次数O(nlogn),移动次数O(nlogn)。

8,最简单的排序方法是冒泡排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的气泡,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个气泡序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即的元素在下面,就交换它们的位置。显然,处理一遍之后,最轻的元素就浮到了最高位置;处理二遍之后,次轻的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是最轻元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。这个算法可实现如下。

procedure Bubble_Sort(var L:List);
var
i,j:position;
begin
1   for  i: = First(L) to Last(L) - 1   do
2    for  j: = First(L) to Last(L) - do
3       if  L[j] > L[j + 1 ] then 
4            swap(L[j],L[j + 1 ]);    // 交换L[j]和L[j+1]
end;

   上述算法将较大的元素看作较重的气泡,每次最大的元素沉到表尾。其中First(L)Last(L)分别表示线性表L的第一个元素和最后一个元素的位置,swap(x,y)交换变量x,y的值。上述算法简单地将线性表的位置当作整数用for循环来处理,但实际上线性表可能用链表实现;而且上述算法将线性表元素的值当作其键值进行处理。不过这些并不影响表达该算法的基本思想。今后如果不加说明,所有的算法都用这种简化方式表达。

   容易看出该算法总共进行了n(n-1)/2次比较。如果swap过程消耗的时间不多的话,主要时间消耗在比较上,因而时间复杂性为O(n2)。但是如果元素类型是一个很大的纪录,则Swap过程要消耗大量的时间,因此有必要分析swap执行的次数。

   显然算法Bubble_Sort在最坏情况下调用n(n-1)/2Swap过程。我们假设输入序列的分布是等可能的。考虑互逆的两个输入序列L1=k1,k2,..,knL2=kn,kn-1,..,k1。我们知道,如果ki>kj,且ki在表中排在kj前面,则在冒泡法排序时必定要将kj换到ki前面,即kj向前浮的过程中一定要穿过一次ki,这个过程要调用一次Swap。对于任意的两个元素

  • 0
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值