排序试题


一 选择题
    1.某内排序方法的稳定性是指(D )。

A.该排序算法不允许有相同的关键字记录     B.该排序算法允许有相同的关键字记录    C.平均时间为0(n log n)的排序方法     D.以上都不对

    2.下面给出的四种排序法中(D )排序法是不稳定性排序法。

A. 插入       B. 冒泡      C. 二路归并       D. 基数   

    3.下列排序算法中,其中( D )是稳定的。

A. 堆排序,冒泡排序    B. 快速排序,堆排序     C. 直接选择排序,归并排序      D. 归并排序,冒泡排序

    4.下列排序方法中,哪一个是稳定的排序方法?(B  ) 。

A.直接选择排序  B.二分法插入排序    C.希尔排序    D.快速排序

    5.若要求尽可能快地对序列进行稳定的排序,则应选(B)

A.快速排序     B.归并排序   C.冒泡排序

    6.如果待排序序列中两个数据元素具有相同的值,在排序前后它们的相互位置发生颠倒,则称该排序算法是不稳定的。(C E )就是不稳定的排序方法。

A.起泡排序      B.归并排序    C.Shell排序      D.直接插入排序    E.简单选择排序

    7.若需在O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是(C )。

A. 快速排序   B. 堆排序   C.归并排序       D. 直接插入排序

    8.对一组数据(84,47,25,15,21)排序,数据的排列次序在排序的过程中的变化为 (1) 84 47 25 15 21 (2) 15 47 25 84 21 (3) 15 21 25 84 47 (4) 15 21 25 47 84 则采用的排序是 ( A )。

A. 选择      B. 冒泡    C. 快速      D. 插入

    9. 对序列{15,9,7,8,20,-1,4}进行排序,进行一趟后数据的排列变为{4,9,-1,8,20,7,15};则采用的是( C )排序。

A. 选择    B. 快速     C. 希尔     D. 冒泡

    10.若上题的数据经一趟排序后的排列为{9,15,7,8,20,-1,4},则采用的是( C )排序。

A.选择     B. 堆      C. 直接插入    D. 冒泡

    11.下列排序算法中( B )不能保证每趟排序至少能将一个元素放到其最终的位置上。

A.快速排序      B. shell排序    C. 堆排序    D.冒泡排序

    12.下列四个序列中,哪一个是堆(C )。

A. 75,65,30,15,25,45,20,10

B. 75,65,45,10,30,25,20,15

C. 75,45,65,30,15,25,20,10

D. 75,45,65,10,25,30,20,15 


二、判断题

1.当待排序的元素很大时,为了交换元素的位置,移动元素要占用较多的时间,这是影响时间复杂度的主要因素。(

2.内排序要求数据一定要以顺序方式存储。 ( ×

3.排序算法中的比较次数与初始元素序列的排列无关。(×

4.排序的稳定性是指排序算法中的比较次数保持不变,且算法能够终止。(×

5.在执行某个排序算法过程中,出现了排序码朝着最终排序序列位置相反方向移动,则该算法是不稳定的。( ×

6.直接选择排序算法在最好情况下的时间复杂度为O(N)。( ×

7.二分法插入排序所需比较次数与待排序记录的初始排列状态相关。(×

8.在初始数据表已经有序时,快速排序算法的时间复杂度为O(nlog2n )。( ×

9.在待排数据基本有序的情况下,快速排序效果最好。( ×

10.当待排序记录已经从小到大排序或者已经从大到小排序时,快速排序的执行时间最省。(×

11.快速排序的速度在所有排序方法中为最快,而且所需附加空间也最少。( ×

12.堆肯定是一棵平衡二叉树。( ×

13.堆是满二叉树。(×

14.(101,88,46,70,34,39,45,58,66,10)是堆。(

15.在用堆排序算法排序时,如果要进行增序排序,则需要采用“大根堆”。(

16.堆排序是稳定的排序方法。(×

17.归并排序辅助存储为O(1)。( ×

18.在分配排序时,最高位优先分配法比最低位优先分配法简单。(×

 

三、填空
1.若不考虑基数排序,则在排序过程中,主要进行的两种基本操作是关键字的比较和记录的移动

2. 属于不稳定排序的有希尔排序、简单选择排序、快速排序、堆排序等

3.分别采用堆排序,快速排序,冒泡排序和归并排序,对初态为有序的表,则最省时间的是冒泡算法,最费时间的是快速 算法。

4. 不受待排序初始序列的影响,时间复杂度为O(n2)的排序算法是简单选择排序,在排序算法的最后一趟开始之前,所有元素都可能不在其最终位置上的排序算法是直接插入排序(最小的元素在最后时)

5.直接插入排序用监视哨的作用是免去查找过程中每一步都要检测整个表是否查找完毕,提高了查找效率。

6.对n个记录的表r[1..n]进行简单选择排序,所需进行的关键字间的比较次数为n(n-1)/2

 

四、应用题

  1. 1. 内部排序(名词解释)。

答:假设含n个记录的序列为{ R1, R2, …,Rn },其相应的关键字序列为{ K1, K2, …,Kn },这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系Ks1≤Ks2≤…≤Ksn,按此固有关系将n个记录序列重新排列为{ Rs1, Rs2, …,Rsn }。若整个排序过程都在内存中完成,则称此类排序问题为内部排序。 


  1. 2.在执行某种排序算法的过程中出现了排序码朝着最终排序序列相反的方向移动,从而认为该排序算法是不稳定的,这种说法对吗?为什么?

答: 这种说法不对。因为排序的不稳定性是指两个关键字值相同的元素的相对次序在排序前、后发生了变化,而题中叙述和排序中稳定性的定义无关,所以此说法不对。对4,3,2,1起泡排序就可否定本题结论。 


  1. 3.设有5个互不相同的元素a、b、c、d、e,能否通过7次比较就将其排好序?如果能,请列出其比较过程;如果不能,则说明原因。

答:可以做到。取a与b进行比较,c与d进行比较。设a>b,c>d(a<b和c<d情况类似),此时需2次比较,取b和d比较,若b>d,则有序a>b>d;若b<d时则有序c>d>b,此时已进行了3次比较。再把另外两个元素按折半插入排序方法,插入到上述某个序列中共需4次比较,从而共需7次比较。 


  1. 4.利用比较的方法进行排序,在最坏的情况下,能达到的最好时间复杂性是什么?请给出详细证明。

答:假定待排序的记录有n个。由于含n个记录的序列可能出现的状态有n!个,则描述n个记录排序过程的判定树必须有n!个叶子结点。因为若少一个叶子,则说明尚有两种状态没有分辨出来。我们知道,若二叉树高度是h,则叶子结点个数最多为2h-1;反之,若有u个叶子结点,则二叉树的高度至少为log2u+1。这就是说,描述n个记录排序的判定树必定存在一条长度为log2(n!)的路径。即任何一个籍助“比较”进行排序的算法,在最坏情况下所需进行的比较次数至少是log2(n!)。根据斯特林公式,有log2(n!) =O(nlog2n)。即籍助于“比较”进行排序的算法在最坏情况下能达到的最好时间复杂度为O(nlog2n)。证毕。 


  1. 5.以下概念的区别:拓扑排序与冒泡排序。

答:拓扑排序,是有向图的顶点依照弧的走向,找出一个全序集的过程,主要是根据与顶点连接的弧来确定顶点序列;冒泡排序是借助交换思想通过比较相邻结点关键字大小进行排序的算法。 


  1. 6.简述直接插入排序,简单选择排序,2-路归并排序的基本思想以及在时间复杂度和排序稳定性上的差别。

答:直接插入排序的基本思想是基于插入,开始假定第一个记录有序,然后从第二个记录开始,依次插入到前面有序的子文件中。即将记录R[i](2<=i<=n)插入到有序子序列R[1..i-1]中,使记录的有序序列从R[1..i-1]变为R[1..i] ,最终使整个文件有序。共进行n-1趟插入。最坏时间复杂度是0(n2),平均时间复杂度是0(n2),空间复杂度是O(1),是稳定排序。
    简单选择排序的基本思想是基于选择,开始有序序列长度为零,第i(1<=i<n)趟简单选择排序是,从无序序列R[i..n]的n-i+1记录中选出关键字最小的记录,和第i个记录交换,使有序序列逐步扩大,最后整个文件有序。共进行n-1趟选择。最坏时间复杂度是0(n2),平均时间复杂度是0(n2),空间复杂度是O(1),是不稳定排序。
    二路并归排序的基本思想是基于归并,开始将具有n个待排序记录的序列看成是n个长度为1的有序序列,然后进行两两归并,得到n/2个长度为2的有序序列,再进行两两归并,得到n/4个长度为4的有序序列。如此重复,经过log2n趟归并,最终得到一个长度为n的有序序列。最坏时间复杂度和平均时间复杂度都是0(nlog2n),空间复杂度是O(n),是稳定排序。 


  1. 7.快速排序,堆排序和希尔排序是时间性能较好的排序方法,也是稳定的排序方法。判断正误并改错。

答:错误。快速排序,堆排序和希尔排序是时间性能较好的排序方法,但都是不稳定的排序方法。 


 

五、算法设计题

  1. 1.输入50个学生的记录(每个学生的记录包括学号和成绩),组成记录数组,然后按成绩由高到低的次序输出(每行10个记录)。排序方法采用选择排序。

答: typedef struct
     { int num; float score; }RecType;
    void SelectSort(RecType R[51],int n)
         { for(i=1; i<n; i++)
        { //选择第i大的记录,并交换到位
        k=i; //假定第i个元素的关键字最大
             for(j=i+1;j<=n;j++) //找最大元素的下标
             if(R[j].score>R[k].score) k=j;
        if(i!=k) R[i] <-->R[k]; //与第i个记录交换
        }//for
         for(i=1; i<=n; i++) //输出成绩
             { printf("%d,%f",R[i].num,R[i].score); if(i%10==0) printf("\n");}
    }//SelectSort 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值