Bootstrap

牛客网编程练习题——1

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

快速排序        归并排序        起泡排序

正确答案:B

排序的稳定性,所谓稳定性即能保证两个相等的数,经过排序之后,其在序列的前后位置顺序不变。

① 稳定性排序:冒泡排序,插入排序、归并排序、基数排序

② 不稳定性排序:选择排序、快速排序、希尔排序、堆排序

2.以下正确定义一维数组的选项是(   )

int a[5] = {0, 1, 2, 3, 4, 5};        char a[] = {0, 1, 2, 3, 4, 5};        char a = {'A', 'B', 'C'};         int a[5] = "0123";

正确答案:B

【A选择:】数组越界。所以错误。 【B选择:】声明char类型,传入了数值数组,而数值会以char类型的ASCII编码写入。所以正确。【C选择:】 数组声没明显不符合规范,左侧声明名后应加上[]。所以错误。 【D选择】:这种声名只能用字符型char等。所以错误。

3.对一组数据(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

根据第一趟排序结果,数据没动,冒泡排序从小到大每一趟排序最大值放在最后,排除。

快速排序是以第一个为基准,所有比它小的元素在左边,比它大的元素在右边,这样,84必定到最后一个位置,排除。

插入排序是不断增大的有序序列,根据第二趟排序结果,应是47,84,***,也排除。

4.在面向对象的程序设计中,关于数组,下列说法正确的有

数组属于一种原生类        数组是一种对象        int number=[]={31,23,33,43,35,63}        数组的大小可以任意改变        

正确答案:B

A.原生类指未被实例化的类,数组一般指实例化,被分配空间的类,不属于原生类.

(在面向对象的编程中,通常把用类创建对象的过程称为实例化,其格式如下:如 Date date=new Date();)

B.对象的特点是封装了一些数据,同时提供了一些属性和方法,从这个角度来讲,数组是对象

C.格式有误

D.数组的大小确定之后不可改变

5.下列说法中错误的是:()

插入排序某些情况下复杂度为O(n)        排序二叉树元素查找的复杂度可能为O(n)    

对于有序列表的排序最快的是快速排序        在有序列表中通过二分查找的复杂度一定是O(log2n)

正确答案:C

A:数据有序时,插入排序的时间复杂度就是O(n)

B:比如只有右孩子结点的树

C:快排是在无序的情况下排序比较快,所以C说法不正确

D:一定是O(nlog2n)        二分查找的复杂度

6.希尔排序的组内排序采用的是 () 。

直接插入排序        折半插入排序        快速排序        归并排序        

正确答案:A

希尔排序的思想是:先将待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成),分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。

7.若给定的关键字集合为{20,15,14,18,21,36,40,10},一趟快速排序结束时,键值的排序为

10,15,14,18,20,36,40,21        10,15,14,18,20,40,36,21        10,15,14,20,18,40,36,21        15,10,14,18,20,36,40,21

正确答案:A

1. 默认选取第一个元素作为基准,将第一个位置变成空位

2. 从尾开始遍历,将第一个比基准小的元素填到空位,然后将该元素的位置变成空位

3. 从头开始遍历,将第一个比基准大的元素填到空位,然后将该元素的位置变成空位

4. 重复 2 和 3,直到空位出现在中间

递归地对所有子序列执行以上步骤即可完成快速排序。

根据上面的算法可以得到第一趟排序结束的时候序列为:10, 15, 14, 18, 20, 36, 40 ,21

8.采用递归方式对顺序表进行快速排序。下列关于递归次数的叙述中,正确的是()。

递归次数与初始数据的排列次序无关        每次划分后,先处理较长的分区可以减少递归次数

每次划分后,先处理较短的分区可以减少递归次数        递归次数与每次划分后得到的分区的处理顺序无关

正确答案:D

快递排序的递归次数与元素的初始排列有关。如果每一次划分后分区比较平衡,则递归次数少;如果划分后分区不平衡,则递归次数多。但快速排序的递归次数与分区处理顺序无关,即先处理较长的分区或先处理较短的分区都不影响递归次数。

此外,可以形象地把快速排序的递归调用过程用一个二叉树描述,先处理较长或较短分区,可以想象为交换某一递归结点处的左右子树,这并不会影响树中的分支数。

9.外部排序常用的算法是?

归并排序        快速排序        堆排序        希尔排序        

正确答案:A

外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行多路归并排序。

10.假设小明用某个排序算法对整数序列(82,45,25,15,21)进行排序。一下为排序过程中序列状态的变化过程:

输入:82 45 25 15 21

第一步:45 82 25 15 21

第二步:25 45 82 15 21

第三步:15 25 45 82 21

······

请问小明用的是什么排序算法?

选择排序        归并排序        快速排序        插入排序        

正确答案:B

从题目中可以得出是逐步将待排序的元素插入到已排序序列的对应位置,属于插入排序。

11.若串S=′software′,其子串的数目是()

8        37        36        9

正确答案:B

空串 空串!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

12.具有 n 个结点的二叉排序树有多种,其中树高最小的二叉排序树是最佳的,这样的说法正确吗?

正确答案:正确

二叉排序树的主要用途是链式存储结构的二分查找,查找的最坏次数是树的高度,因此高度最小的二叉排序树是最佳的。

13.数组定义为“ int a [ 4 ] ; ”,表达式 ( ) 是错误的。

*a        a [ 0 ]        a        a++

正确答案:D

a代表数组名或者内存连续区域第一块数据的地址。接[]表示基址寻址。加*表示对数组起始位置按照数组元素数据类型寻址取值第一个元素。加&表示取第一个元素地址。a与&a与&a[0]相同。a为常量,可以运算,不可赋值。

14.在有序表( 7, 13, 33, 87, 99, 97, 117, 123,129,131,137)中,使用二分查找算法查找13时需要的关键字比较次数是()

正确答案:4

step1. mid=(left+right)//2=5  num[5]=97    13<97   right=mid-1=4

step2. mid=(left+right)//2=2  num[2]=33    13<33   right=mid-1=1

step3. mid=(left+right)//2=0  num[0]=7      13>7     left=mid+1=1

step4. mid=(left+right)//2=1  num[1]=13    13==13  break

15.请问下面哪种方式可以在不改变原来数组的情况下,拷贝出数组 b ,且满足 b!=a 。例如数组 a 为 [1,2,3] 。

let b=a;        let b=a.slice();        let b=a.splice(0,0);        let b=a.concat();

正确答案:D

A选项 b=[1,2,3]   b==a

B选项 b=[1,2,3]   b!=a

C选项 b=[]           b!=a

D选项 b=[1,2,3]   b!=a

slice和concat方法均返回新数组,而splice方法的主要作用就是对原数组进行增删改操作,返回值为截取删除掉的子数组

16.对于静态表的顺序查找法,若在表头设置监视哨,则正确的查找方式为()。

从第0个元素往后查找该数据元素        从第1个元素往后查找该数据元素        

从第1个元素往后查找该数据元素        与查找顺序无关

正确答案:C

常把第一个或最后一个元素作为哨兵

表头设置监视哨,就是将空出来的下标为0的这个元素的值设为Key,

这样我们就不用多次判断 i 是否越界,因为就算静态表中找不到,也会在0位置上配对成功,返回0!

 

n个元素都要比较一次,但都不成功,最后监视哨也要比较一次,比较成功,一共比较n+1次.

例子:有5个元素,分别是1,2,3,4,5.要找的元素是8.那么8就是监视哨,数列如下:

8,1,2,3,4,5.

从5开始向前查找,一共要比较6次,比较到监视哨成功,监视哨所在的下标是0,所以返回值为0.

17.优先级队列和有序数组的一个区别是()

最低优先级别的数据项不能从数组中轻易的提取出来,而在优先级队列中可以。        数组必须是有序的,而优先级队列不需要。

最高优先级的数据项可以很容易地从优先级队列中提取出来,而有序数组不行。        其他三个选项都是。

正确答案:A

A.最大堆你可以想象成一颗二叉树,堆顶元素一定是最大值,然后它的每一棵子树也都是最大堆。优先队列的默认实现是最大堆,但是里面有个参数可以设置,设置之后就是最小堆。所以A是对的,最低优先级可以提取

B.数组和优先队列都不是有序的

C.有序数组是一种特殊的数组,里面的元素,按一定的顺序排列。有序数组可以直接提取最高优先级的元素

18.以下多维数组声明语句中,不正确的有(  )。

int[,]a = new int[2,3];        int[,] a = {{1,2,3}};        int[2,3] a = new int[2,3];        int[,] a = {{1,2,3},{2,3}}        

正确答案:B

二维数组!

19.下面关于排序算法描述正确的是

冒泡排序算法平均时间复杂度是O(N的平方)        平均时间复杂度低的算法不一定是最优算法

原表(排序之前的表)是否有序对排序算法的影响不大        选择排序算法时,需要考虑表中元素的个数

正确答案:ABD

20.Which of the following statements are true?

We can create a binary tree from given inorder and preorder traversal sequences.

We can create a binary tree from given preorder and postorder traversal sequences.

For an almost sorted array, insertion sort can be more effective than Quicksort.

Suppose T(n) is the runtime of resolving a problem with n elements, T(n) = Θ(1) if n = 1; T(n) = 2T(n/2) + Θ(n) if > 1; so T(n) is Θ(n log n).

正确答案:ACD

下列哪些描述是对的?

A.我们可以从给定的整齐的并且前序遍历序列创建一个二叉树

B.我们可以从给定的前序遍历和后序遍历序列创建一个二叉树

C.对于一个基本有序的数组,插入排序比快速排序效率更高

D.假设T(n)是解决一个有n个元素的问题的时间复杂度,T(n) = Θ(1),如果n = 1; T(n) = 2T(n/2) + Θ(n) 如果 n > 1; 那么 T(n) 是 Θ(n log n).

E.以上都不正确

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

;