Bootstrap

数据结构题目摘录

线性表,顺序表,链表,数组的区别与联系

转载https://www.cnblogs.com/liuhaier/p/10574225.html
在C语言中,数组和线性表的区别:数组长度不可变,线性表长度是动态可变的。

逻辑结构:结构定义中是对操作对像的数学描述,描述的是数据元素之间的逻辑关系。例如,线性结构,树形结构,图状结构或网状结构。它们都属于逻辑结构。

物理结构:又称存储结构,是数据结构在计算机中的表示(又称映像)。例如,数组,指针。

搞清楚了上面的两个概念,相信就很好理解区分线性表,顺序表,链表,数组了。

线性表:属于逻辑结构中的线性结构,它包括顺序表和链表。

顺序表:线性表中的一种,它是用数组来实现的一种线性表,所以它的存储结构(物理结构)是连续的。

链表:线性表中的一种,它的存储结构是用任意一组存储单元来存储数据元素。所以它的存储结构可以是连续的,也可以不是连续的。一般我们说的链表都是不连续的。有一种用数组来表示的链表,叫做静态链表,它的存储结构就是连续的。

数组:一种物理结构,它的存储单元是连续的。

下面用一张关系图来说明它们之间的关系。
在这里插入图片描述

题目摘录

  1. 与数据元素本身的形式、内容、相对位置、个数无关的是数据的(B)
    A) 存储结构 B) 逻辑结构 C) 算法 D)操作

  1. 下列叙述中正确的是(D)。
    A)一个逻辑数据结构只能有一种存储结构
    B)数据的逻辑结构属于线性结构,存储结构属于非线性结构
    C)一个逻辑数据结构可以有多种存储结构,且各种存储结构不影响数据处理的效率
    D)一个逻辑数据结构可以有多种存储结构,且各种存储结构影响数据处理的效率

  1. 数据的基本单位是(C)
    A) 数据项 B) 数据类型 C) 数据元素 D) 数据变量

  1. 下列程序的时间复杂度为( )
    i=0;s=0;
    while(s<n)
    { i++;s=s+i;}

       设运行时间为T(n),循环次数为k,则T(n)=k
       则显然循环是在做一个等差数列求和,当和大于等于n时停止,即k(k+1)/2>=n时停止
       解得k=ceil((sqrt(8n+1)-1)/2)<=(sqrt(8n+1)-1)/2+1
       即T(n)=k<=sqrt(2n+1/4)+1<=c*sqrt(n) (取c=2即成立)
       故时间复杂度为T(n)=O(sqrt(n)) 
    

  1. 程序段
    for ( i=n-1; i>=1; i–)
    for ( j=1; j>=i ; j++)
    if (a[j]>a[j+1] )
    { t=a[j]; a[j]= a[j+1]; a[j+1]= t; }
    其中 n为正整数,则最后一行的语句频度在最坏情况下是(D)。

    A) O(n) B) O(nlogn) C) O(n3) D) O(n2)
冒泡排序
最内层循环的循环次数是递减的,从n-1次递减到1次,所以最内层总共是执行
1+2+3+....+(n-1)=n(n-1)/2次,所以if语句的执行次数是 n(n-1)/2 次。 

  1. 设有一个递归算法如下:
    int fact(int n)
    { /
    大于等于0 /
    if ( n<=0 ) return 1 ;
    else return n
    fact (n-1) ;
    }
    则计算fact(n)需要调用该函数的次数为( n+1 )。
    *

  1. 求循环链表中当前结点的后继和前驱的时间复杂度分别是( O(1)和O(n)  )
循环链表就是单链表

  1. 已知一个有序表为(13,18,24,35,47,50,62,83,90,115,134),当二分检索值为90的元素时,检索成功需比较的次数是( 2 )。
 mid=(low + high) / 2 
 此题是考查数据结构二分查找问题。其通过第一次的二分与第六个元素比较,然后再通过一次的二分与第九个元素比较,找到元素
 ,所以为2次。

  1. 假设以行优先顺序存储三维数组R[6][9][6],其中元素R[0][0][0]的地址为2100,且每个元素占4个存储单元,则存储地址为2836的元素是(  R[3][3][4]  )。

在这里插入代码片


  1. 线性表采用链式存储时,节点的存储的地址( B )。

A) 必须是不连续的 B) 连续与否均可

C) 必须是连续的 D) 和头节点的存储地址相连续


  1. 链表不具有的特点是(B ) 。

A) 插入、删除不需要移动元素 B) 可随机访问任一元素

C) 不必事先估计存储空间 D) 所需空间与线性长度成正比


  1. 采用顺序搜索方法查找长度为n的顺序表示,搜索成功的平均搜索长度为( D )。

A) n    B) n/2   C) (n-1)/2      D) (n+1)/2


  1. 将长度为n的单链表链接在长度为m的单链表之后的算法的时间复杂度为( O(m))。
由于将长度为,z的单链表链接在长度为m的单链表之后的操作,需要把长度为m的单链表遍历一遍,找到最后一个节点,所以时间复杂度为O(m)

  1. 若已知一个栈的入栈序列是1,2,3,4……n,其输出序列为p1,p2,p3,……pn,若p1= =n,则pi为( n-i+1 )。

  1. 设数组data[m]作为循环队列SQ的存储空间,front为队头指针,rear为队尾指针,则执行出对操作后其头指针front值为(D )。

A) front=front+1 B) front=(front+1)%(m-1)

C) front=(front-1)%m D) front=(front+1)%m


  1. 引起循环队列队头位置发生变化的操作是( A )。

A) 出队 B) 入队   C) 取队头元素 D) 取队尾元素


  1. 设以数组A[m]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中的元素个数为( A )。

A)(rear-front+m)%m B)rear-front+1 C)(front-rear+m)%m D)(rear-front)%m


  1. 若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1…(n(n+1))/2]中,则在B中确定aij(i<j)的位置k的关系为( B )。

A) i*(i-1)/2+j
B) j*(j-1)/2+i
C) i*(i+1)/2+j
D) j*(j+1)/2+i

在这里插入图片描述


  1. 对稀疏矩阵进行压缩存储目的是( C )。

A) 便于进行矩阵运算 B) 便于输入和输出

C) 节省存储空间 D) 降低运算的时间复杂度


  1. 设广义表L=((a,b,c)),则L的长度和深度分别为( C )。

A) 1和1
B) 1和3
C) 1和2
D) 2和3

广义表一般记作
LS=(a1,a2,...,an)
其中n是它的长度,ai可以是单个元素(原子),也可以是广义表(子表),当广义表非空时,称第一个元素a1为LS的表头,称其余元素组成的表为LS的表尾。
注意:表头是元素(可以是原子,也可以是广表),而表尾一定是广义表。例如:
C=((a),a)的表头是(a),表尾是(a)((a))的表头是(a),表尾是()。
广义表的深度定义为所含括弧的重数。注意:原子的深度为0,空表的深度为1。
例如:
E=(a,E)是一个递归的广义表,长度为2,深度为1。
D=(()(e)(a,(b,c,d)))是多层次的广义表,长度为3,深度为3
  1. 树中所有结点的度之和等于所有结点数加( -1 )。

  1. 在一棵具有n个结点的二叉链表中,所有结点的空域个数等于( n+1)。

  1. 某二叉树的先序序列和后序序列正好相反,则该二叉树一定是(B )的二叉树。

A) 空或只有一个结点 B) 高度等于其节点数

C) 任一结点无左孩子 D) 任一结点无右孩子

由于先序遍历是“根――左子树――右子树”,而后序遍历是“左子树――右子树――根”,若某二叉树的先序和后序序列正好相反,则该二叉树每层左、右子树只能有1个,即则该二叉树一定是高度等于其结点数。

  1. 对一棵有100个结点的完全二叉树按层编号,则编号为49的结点,它的父结点的编号为( 24 )
i结点的左孩子是2i,右孩子是2i+1,所以49的父节点编号为 (49-1/2 = 24

  1. 可以惟一地转化成一棵一般树的二叉树的特点是( B )

A)根结点无左孩子
B)根结点无右孩子
C)根结点有两个孩子
D)根结点没有孩子

因为一般树转成二叉树的步骤是保留左孩子连线,所以二叉树转为一般树必须有左孩子
  1. 设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为(2h-1 )。
结点最少的情况如下图所示:除根结点层只有1个结点外,其余H-1层都有两个结点,因此结点总数为2*(H-1)+1=2*H-1
  1. 在一棵度为3的树中,度为3的节点个数为2,度为2的节点个数为1,则度为0的节点个数为(6)。
设n为总的节点个数,则孩子结点数为n-1,因为除了根节点每个节点都有父母节点。n0为度为0的节点个数,n1为度为1的节点个数,n2为度为2的节点个数,
n3为度为3的节点个数,则:n=n0+n1+n2+n3。
又,树中除了根节点不是孩子节点外,其余的都是孩子节点,而n1个度为1的节点有n1个孩子,
n2个度为2的节点有2*n2个孩子,n3个度为3的节点有3*n3个孩子,即孩子节点数n-1=n1+2n2+3n3。
由此可得:n0+n1+n2+n3=n1+2n2+3n3+1,推导出n0=n2+2n3+l=1+2*2+1=6

  1. 设森林F对应的二叉树为B,它有m个结点,B的根为p,p的右子树结点个数为n,森林F中第一棵 子树的结点个数是( m-n )
    在这里插入图片描述

  1. 树最适合用来表示( C )

A) 有序数据元素
B) 无序数据元素
C) 元素之间具有分支层次关系的数据
D) 元素之间无联系的数据


  1. 任何一棵二叉树的叶结点在先序、中序和后序遍历序列中相对次序( A )。

    A) 不发生改变
    B) 发生改变
    C) 不能确定
    D) 以上都不对


  1. 在有n个叶子结点的哈夫曼树中,其结点总数为( D )。

    A) 不确定
    B) 2n
    C) 2n+1
    D) 2n-1

哈弗曼树也是二叉树,而且树中只有叶子结点跟度为2的结点,由二叉树的性质可得:度为2的结点数量等于叶子结点数量-1,因此结点总数为n+n-1
  1. 权值为{1,2,6,8}的四个结点构成的哈夫曼树的带权路径长度是( 29 )。
先构造哈夫曼树:
			  17
			 /   \
			8     9
		  /   \
		 3     6
	   /   \
	 1       2
所以带权路径长度WPL =1+2*3 + 6*2 + 8*1 = 29 

在这里插入图片描述


  1. 对一个满二叉树,m个树叶,k个分枝结点,n个结点,则( n=k+m。 )。
树叶为叶子节点,树叶为度不为0的结点
假设这棵树的高度为h,
所以m=2^(h-1)、
n=(2^h)-1、
k=2^(h-1)-1,
n=k+m

  1. 在含有n个顶点和e条边的无向图的邻接矩阵中,零元素的个数为(n²-2e)
邻接矩阵中,两顶点之间存在边的对应位置为1,否则为0,
n个顶点的矩阵中共有n2个元素,因为存在e条边,因此在矩阵中有2e个位置为1,
则零元素个数就为n2-2e。

在这里插入图片描述


  1. 对于含n个顶点和e条边的图,采用邻接矩阵表示的空间复杂度为( O(n²)   )。
    在这里插入图片描述在这里插入图片描述

  1. 如果求一个连通图中以某个顶点为根的高度最小的生成树,应采用(B)
    A) 深度优先搜索算法
    B) 广度优先搜索算法
    C) 求最小生成树的prim算法
    D) 拓扑排序算法
横向搜索,可以增加分支数,减小高度 

  1. n个顶点的连通图至少中含有(N-1)条边
至少要有(N-1)条边(也就是树)才能保证图为连通图.
对于简单图而言至多有n*(n-1)/2条边,此时即是完全图.

  1. n个顶点的完全有向图中含有( n(n-1)条有向边 )。
n个顶点的有向完全图中,每个顶点都向其他n-1个顶点发出一条弧,
因此总的有向边的数目为n(n-1)

  1. 假设一个有n个顶点和e条弧的有向图用邻接表表示,则删除预某个顶点vi相关的所有弧的时间复杂度是( O(n+e) )。
因为要找到所有以这个顶点为终点的弧,必须将整个邻接表找完才行,
这个不是逆邻接表,每个顶点的边表只管出不管入

  1. 在无向图中定义顶点Vi与Vj之间的路径为从Vi到达Vj的一个( A )。

A) 顶点序列
B) 边序列
C) 权值总和
D) 边的条数


  1. 无向图G=(V,E),其中:V={a,b,c,d,e,f}, E={(a,b),(a,e),(a,c),(b,e),(c,f), (f,d),(e,d)},对该图进行深度优先遍历,得到的顶点序列正确的是( D )。

A) a,b,e,c,d,f
B) a,c,f,e,b,d
C) a,e,b,c,f,d
D) a,e,d,f,c,b
在这里插入图片描述


  1. 下面哪一方法可以判断出一个有向图是否有环(回路)B。

A) 求节点的度 B) 拓扑排序 C) 求最短路径 D) 求关键路径

链接:https://www.nowcoder.com/questionTerminal/afbe3e85e2a9461498afae7883f5683b?toCommentId=942732
来源:牛客网

对于有向图的拓扑排序,
    1计算图中所有点的入度,把入度为0的点加入栈
    2.如果栈非空:取出栈顶顶点a,输出该顶点值,删除该顶点
    3从图中删除所有以a为起始点的边,如果删除的边的另一个顶点入度为0,则把它入栈
    4如果图中还存在顶点,则表示图中存在环;否则输出的顶点就是一个拓扑排序序列 

  1. 图的深度优先搜索算法类似于二叉树的( A )。
    由广度优先搜索遍历的定义可知其类似于(按层次遍历)的过程。
    A.前序遍历
    B.中序遍历
    C.后序遍历
    D.按层次遍历
深度优先搜索是从图中某个顶点V出发,访问此顶点,
然后依次从V的未被访问的邻接点出发深度优先遍历图,
直至图中所有和V有路径相通的顶点都被访问到。深度搜索遍历类似于树的先根遍历,
是树的先根遍历的推广,所以答案为A。
同理,由广度优先搜索遍历的定义可知其类似于按层次遍历的过程。

  1. 在图采用邻接表存储时,求最小生成树的 Prim 算法的时间复杂度为( B )。

A) O(n)
B) O(n+e)
C) O(n2)
D) O(n3)


  1. 已知有向图G=(V,E),其中V={V1,V2,V3,V4,V5,V6,V7},E={<V1,V2>,<V1,V3>,<V1,V4>, <V2,V5>,<V3,V5>,<V3,V6>,<V4,V6>,<V5,V7>,<V6,V7>},G的拓扑序列是( V1,V3,V4,V6,V2,V5,V7 )
    在这里插入图片描述

  1. 关键路径是事件结点网络中的 ( A ) 。

A.从源点到汇点的最长路径
B.从源点到汇点的最短路径
C.最长的回路
D.最短的回路

在AOE网中,从源点到汇点的所有路径中,具有最大路径长度的路径成为关键路径。
在AOE网中,可以有不止一条的关键路径。

  1. 在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的( 1 )倍
入度之和等于出度之和
  1. 有8个结点的无向图最多有( 28 )条边
2个结点间有一条边,因此8个结点最多有C(8, 2)条边
也就是8*(8-1)/2=28条边
  1. 用邻接表表示图进行广度优先遍历时,通常是采用( 队列 )来实现算法的
    用邻接表表示图进行深度优先遍历时,通常是采用( 栈 )来实现算法的。
广度优先用队列,深度优先用栈

  1. 已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是( 0 1 3 4 2 5 6 )
    则从顶点0出发,按广度优先遍历的结点序列是( 0 1 2 3 4 6 5 )
    在这里插入图片描述
因为是深度优先,找到与顶点0直接相连的结点,
由邻接矩阵知道是顶点1(多个相邻节点取第一个找到的未遍历到的结点),
然后再在邻接矩阵中找与顶点1直接相连的结点,得到顶点3.
相同方法找到后续结点为:顶点4,顶点2.因为顶点2的相连结点都已被遍历,
所以退回到顶点4继续遍历,遍历到顶点5,然后是顶点6

  1. 深度优先遍历类似于二叉树的( 先序遍历 )
    广度优先遍历类似于二叉树的( 层次遍历 )

  1. 任何一个无向连通图的最小生成树( B )。

A) 只有一棵
B) 一棵或多棵
C) 一定有多棵
D) 可能不存在

理由:1、只有一个顶点的图,它的最小生成树只有一个。
     2、若有权值相同的路径会导致有多个。

  1. 在分析折半查找的性能时常常加入失败节点,即外节点,从而形成扩充的二叉树。若设失败节点i所在层次为Li,那么查找失败到达失败点时所做的数据比较次数是( D )。

A) Li+1
B) Li+2
C) Li-1
D) Li


  1. 衡量查找算法效率的主要标准是( C )

A) 元素的个数
B) 所需的存储量
C) 平均查找长度
D) 算法难易程度


  1. 适合对动态查找表进行高效率查找的组织结构是( 二叉排序树 )

  1. 能进行二分查找的线性表,必须以( A )

A) 顺序方式存储,且元素按关键字有序
B) 链式方式存储,且元素按关键字有序
C) 顺序方式存储,且元素按关键字分块有序
D) 链式方式存储,且元素按关键字分块有序


  1. 为使平均查找长度达到最小,当由关键字集合{05,11,21,25,37,40,41,62,84}构建二叉排序树时,第一个插入的关键字应为(   )

  1. 对关键字序列(56,23,78,92,88,67,19,34)进行增量为3的一趟希尔排序的结果为 ( D )
    A) (19,23,56,34,78,67,88,92)  
    B) 23,56,78,66,88,92,19,34)
    C) (19,23,34,56,67,78,88,92) 
    D) (19,23,67,56,34,78,92,88)
希尔排序的基本思想是:取一个小于n的整数d1作为第一个增量,
把文件的全部记录分成d1个组,所有距离为d1的倍数的记录放在同一个组中。
首先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-1<…<d2<d1),
即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。
根据希尔排序的基本思想,题目中给出了增量是3,
而关键字序列(5623789288671934)中的元素个数是8,
其分成的分组分别是(569219)(238834)(7867),
对各个分组进行直接插入排序后得到的是(195692)(233488)(6778),再将各排好序的分组放到原序列各分组相应的位置,
可以得到(1923675634789288)

  1. 用某种排序方法对关键字序列{35,84,21,47,15,27,68,25,20}进行排序时,序列的变化情况如下:
    20,15,21,25,47,27,68,35,84
    15,20,21,25,35,27,47,68,84
    15,20,21,25,27,35,47,68,84
    则采用的方法是(D )

A) 直接选择排序
B) 希尔排序
C) 堆排序
D) 快速排序

首先第一步以25为基础,小于25的放在25的左边,大于25的放在25的右边
得到20,15,21,25,47,27,68,35,84
第二部在25的两边分别进行快速排序,左边以20的基数,右边以47为基数
得到15,20,21,25,35,27,47,68,84
第三步将3527这个子序列排序,得到
15,20,21,25,27,35,47,68,84

  1. 一组记录的排序码为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的第一次划分结果为(C )

    A) 38,40,46,56,79,84
    B) 40,38,46,79,56,84
    C) 40,38,46,56,79,84
    D) 40,38,46,84,56,79

首先,从high的位置向前搜索,找到第一个小于t的记录,
将这个记录和e[low]的值交换;然后,从low所指向的位置向后搜索,
找到第一个值大于t的记录,将这个记录和e[high]的值交换。
重复以上步骤,直到low=high。完成一趟排序,
low(或者high)指向的位置就是第一个元素的确切位置(从两边向中间“夹挤”)

  1. 快速排序在最坏情况下的时间复杂度是(O(n2) )
    快速排序在最优情况下的时间复杂度是(O(nlogn) )
    快速排序在平均情况的时间复杂度是 (O(nlogn) )
    在这里插入图片描述

  1. 下列排序算法中不稳定的是( D )

A) 直接选择排序 B) 折半插入排序 C) 冒泡排序 D) 快速排序

由于关键字的比较和交换时跳跃进行的

在这里插入图片描述


  1. 将5个不同的数据进行排序,至多需要比较( 10 )次
    将5个不同的数据进行排序,至少需要比较( 4 )次

在这里插入图片描述


  1. 排序算法中,第一趟排序后,任一元素都不能确定其最终位置的算法是(D)

A)选择排序
B)快速排序
C)冒泡排序
D)插入排序


  1. 排序算法中,不稳定的排序是( C )

A)直接插入排 序
B)冒泡排序
C)堆排序
D)选择排序


  1. 排序方法中,从未排序序列中依次取出元素与已排序序列(初始时为空)中的元素进行比较,将其放入已排序序列的正确位置上的方法,称为( C )

A) 希尔排序
B) 冒泡排序
C) 插入排序
D) 选择排序


  1. 从未排序序列中挑选元素,并将其依次插入已排序序列(初始时为空)的一端的方法,称为( D )

A) 希尔排序
B) 归并排序
C) 插入排序
D) 选择排序


  1. 对n个不同的排序码进行冒泡排序,在下列哪种情况下比较的次数最多( B )

A) 从小到大排列好的
B) 从大到小排列好的
C) 元素无序
D) 元素基本有序


  1. 对n个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数为( n(n-1)/2 )
第一趟,比较n-1,确定第n个据元素
第二趟,比较n-2,确定第n-1个数据元素
第三趟,比较n-3,确定第n-2个数据元素
第n-1,比较1,确定第12个数据元素
总的比较次数=(n-1)+(n-2)+.+1=n(n-1)/2
  1. 快速排序在下列哪种情况下最易发挥其长处( C )

A) 被排序的数据中含有多个相同排序码
B) 被排序的数据已基本有序
C) 被排序的数据完全无序
D) 被排序的数据中的最大值和最小值相差悬殊

这就是快速排序的适用场合,越混乱越好

  1. 下列关键字序列中,( D )是堆

A) 16, 72, 31, 23, 94, 53
B) 94, 23, 31, 72, 16, 53
C) 16, 53, 23, 94, 31, 72
D) 16, 23, 53, 31, 94, 72

小顶堆,将所有数据序列按完全二叉树从根开始放,
如果所有分支都小于或者等于孩子结点关键码,就是小顶堆,
反之,如果所有分支结点的关键码大于或者等于孩子结点关键码,则为大顶堆 

  1. 堆是一种( B )排序

A) 插入 B) 选择 C) 交换 D) 归并

选择排序有直接选择排序和堆排序两种。

  1. 堆的形状是一棵( 完全二叉树 )

  1. 一组记录的排序码(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为( B )

A) (79,46,56,38,40,84)
B)(84,79,56,38,40,46)
C)(84,79,56,46,40,38)
D)(84,56,79,40,38,46)

我排序的过程,跟你不一样,不过结果是对的。先把数据构建成最大堆。就是根节点比它的2个子节点要大。
56
50 48
这就市最大堆
你的原数据
46
79 56
38 40 84
84比它的根大,所以845646
79 84
38 40 56
3840都比它的根节点79小,所以不动
然后看第2层,8446大,所以拿它跟父节点的4684
79 46
38 40 56
46换下去还市比它的子节点56小,再换(这个要注意,可能小的被换下来,但是仍然比下面的大,就继续换下去)
84
79 56
38 40 46
目前就已经是最大堆了
然后是堆排序,
拿最上面的84,跟46换,
46
79 56
38 408484换好以后再也不能动了,然后再构建剩下的6个数的最大堆:
46
79 56
38 40844038都比79小不动,56比父节点46大,所以换:
56
79 46
38 4084】
接下来市797956大,换
79
56 46
38 4084】
最大堆完成(84已经不动了,可以不考虑它了),然后79跟最后一个40换,
同样,换了以后,79也不能动,而且以后的排序也不用考虑它
40
56 46
3879】 【84】
然后再构建最大堆
38,不动,464046
56 40
3879】 【84】
然后564656
46 40
3879】 【84】
又排好了,然后563838
46 4056】 【79】 【84】
再排序(排序过程不说了),排好如下:
46
40 3856】 【79】 【84463838
4046】
【56】 【79】 【84】
再排序:
40
3846】
【56】 【79】 【84】
再首尾相换
3840】 【46】
【56】 【79】 【84】
结束。
从头开始输出:38 40 46 56 79 84 是最后结果。

  1. 下述几种排序方法中,要求内存最大的是( C )

A) 插入排序
B) 快速排序
C) 归并排序
D) 选择排序

ABC是内排序D归并排序是外排序---需要借助等大的外部内存


快速排序的基本思想是,通过一趟排序将排序记录分割成独立的两部
分,其中一部分记录的关键字均比另一部分记录的关键字小,再分别对这两部分记录继续进行排序,以达到整个序列有序;
插入排序的基本操作是指将无序序列中的各元素依次插入到已经有序的线性表中,从而得到一个新的序列;
选择排序的基本思想是:扫描整个线性表,从中选出最小的元素,将它交换到表的最前面(这是它应有的位置),然后对剩下的于表采用同样的方法,直到表空为止;
归并:排序是将两个或两个以上的有序表组合成一个新的有序表。

  1. 有一组数据(15,9,7,8,20,-1,7,4),用堆排序的筛选方法建立的初始堆为( C )

A) -1,4,8,9,20,7,15,7
B) -1,7,15,7,4,8,20,9
C) -1,4,7,8,20,15,7,9
D) A,B,C 均不对。


  1. 快速排序方法在( D )情况下最不利于发挥其长处

A) 要排序的数据量太大
B) 要排序的数据中含有多个相同值
C) 要排序的数据个数为奇数
D) 要排序的数据已基本有序

 快速排序的基本思想是以基准元素为中心,将待排序表分成两个子表,
 然后继续对子表进行划分,直到所有子表的长度为1。
 如果每次划分结果,两个子表长度相等,则效率最高,
 如果一个子表的长度为0则效率最低。
 对已基本有序的表以第1个为标准进行划分时,
 其中一个表长度将基本为0,效率最低。

;