NewCoder(牛客)题集--TWO

1.二元查找树的任何结点的左右子树都是二元查找树()

对/错

解:对

解析:

   二元查找树: 它首先要是一棵 二元树 ,在这基础上它或者是一棵空树;或者是具有下列性质的二元树:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的 根结点 的值;

(3)左、右子树也分别为二元查找树

2.用希尔排序方法对一个数据序列进行排序时,若第1趟排序结果为9,1,4,13,7,8,20,23,15,则该趟排序采用的增量(间隔)可能是 

A.2                       B.3                          C.4                          D.5

解:B

解析:

首先,第二个元素为1,是整个序列中的最小元素,所以可知该希尔排序为从小到大排序。然后考虑增量问题,

若增量为2,第1+2个元素4明显比第1个元素9要小,A排除;

若增量为3,第i、i+3、i+6个元素都为有序序列(i=1,2,3),符合希尔排序的定义;

若增量为4,第1个元素9比第1+4个元素7要大,C排除;

若增量为5,第1个元素9比第1+5个元素8要大,D排除,

3.采用二分查找方法查找长度为n的线性表时,每个元素的平均查找长度为()

A.O(n^2)                    B.O(nlog2n)                         C.O(n)                       D.O(log2n)

解:D

解析:

二分查找方法的思想:将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。

最好的情况是:待查关键字刚好位于序列中间,第一次即查到。

最坏的情况是:第一次查找,还剩下n/2个元素需要比较;第二次,还剩n/4……第i次查找,还剩下n/2i个元素需要比较,直到剩余最后一个元素,查找结束。

最后n/2i=1,即n=2i,i为查找的次数(长度),i=log2n,

4.将一个递归算法转换为非递归算法,通常需要借用的数据结构是(    )

A.栈         B.队列         C.线性表      D.广义表

解:A

解析:

栈和递归的原理是一样的

栈是后进先出

递归的第一次判断先‘进’,最后返回;终止条件最后‘进’,第一个返回

5.数据表A中有10000个元案,如果仅要求求出其中最大的10个元素,则采用()排序算法最节省时间。

A.简单选择排序                  B.希尔排序                   C.堆排序                     D.快速排序

解:C

解析:

6.在下列排序算法中,哪一个算法的时间复杂度与初始排序无关(     )。

A.直接插入排序            B.气泡排序         C.快速排序           D.直接选择排序

解:D

解析:

堆归选基与初始序列无关

快选希堆排序不稳定

7.排序时,若不采用计数排序的等空间换时间的方法,合并m个长度为n的已排序数组的时间复杂度最优为()

A.O(mn(logm))      B.O(mlog(n))      C.O(nm^2)          D.O(nm)

解:A

解析:当n=1时,就成了m个数的归并排序,时间复杂度为O(mlogm)

8.

A.对数组a进行插入排序(升序)             B.对数组a进行插入排序(降序)

C.对数组a进行选择排序(升序)             D.对数组a进行选择排序(降序)

解:A

解析:

插入排序的原理:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的移动数据,空出一个适当的位置,把待插入的元素放到里面去

选择排序的原理:每次在无序队列中“选择”出最小值,放到有序队列的最后,并从无序队列中去除该值。

9.以下属于稳定排序的是()

A.归并排序和基数排序          B.快速排序和堆排序

C.选择排序和希尔排序          D.插入排序和冒泡排序

解:AD

解析:

稳定:冒泡、插入、归并、计数、桶、基数

不稳定:选择、希尔、快速、堆

10.以下各排序算法与其平均时间复杂度对应正确的有()

A.快排 O(nlogn)         B.桶排序 O(nlogn)        C.冒泡排序 O(n^2)          D.归并排序 O(n^2)

解:AC

解析:

快排:  O(nlogn) 

桶排:O(n+k)

冒泡:O(n^2)

归并:O(nlogn)

11.多维数组可以看作数据元素也是基本线性表的基本线性表,这样的说法正确吗?

解:正确

解析:数组和一维数组一样,都是一段连续的内存

12.使用快速排序算法对序列9,1,3,8,23,5,7,10,29,19进行排序,基准数取9,则第1趟排序后的结果为(      )

A.9,1,3,8,23,5,7,10,29,19           B.7,1,3,8,5,9,23,10,29,19

C.1,3,8,9,23,5,7,10,29,19           D.9,1,3,8,23,5,7,10,19,29

解:B

解析:先确定基准值,然后从后向前找比基准值小的数,找到后将其与比它小的数进行交换,然后从前向后找比基准值大的数,将其交换,周而复始,直到确定下基准值的位置

13.以下哪种排序算法对[1, 3, 2, 4, 5, 6, 7, 8, 9]进行排序最快

A.改良的冒泡排序           B.快速排序           C.归并排序           D.堆排序

解:A

解析:

改良的冒泡排序时间复杂度降到O(n)。

堆排序、快速排序、堆排序平均时间复杂度都为O(nlogn)

14.假设你只有100Mb的内存,需要对1Gb的数据进行排序,最合适的算法是()

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

解:A

解析:首先内存只有100Mb,而数据却有1Gb,所以肯定没法一次性放到内存去排序,只能用外部排序,而外排序通常是使用多路归并排序,即将原文件分解成多个能够一次性装入内存的部分(如这里的100Mb),分别把每一部分调入内存完成排序(根据情况选取适合的内排算法),然后对已经排序的子文件进行多路归并排序(胜者树或败者树)

15.堆排序的时间复杂度是(),堆排序中建堆过程的时间复杂度是()

A.O(n2),O(n log n)             B.O(n),O(n log n)

C.O(n log n),(n)                  D.O(n log n),O(n log n)

解:C

解析:

堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。时间复杂度O(n*logn)

如果从底部最后的父节点开始建堆,那么我们可以大概算一下: 假如有N个节点,那么高度为H=logN,最后一层每个父节点最多只需要下调1次,倒数第二层最多只需要下调2次,顶点最多需要下调H次,而最后一层父节点共有2^(H-1)个,倒数第二层公有2^(H-2),顶点只有1(2^0)个,所以总共的时间复杂度为s = 1 * 2^(H-1) + 2 * 2^(H-2) + ... + (H-1) * 2^1 + H * 2^0 将H代入后s= 2N - 2 - log2(N),近似的时间复杂度就是O(N)。

16.使用堆排序方法排序(45,78,57,25,41,89),初始堆为(      )

A.78,45,57,25,41,89            B.89,78,57,25,41,45

C.89,78,25,45,41,57            D.89,45,78,41,57,25

解:B

解析:

首先建立完全二叉树

从最后一个叶子节点开始

第一次交换了57和89的位置

然后比较45和89,进行交换

再比较换下来的45,45不符合大根堆,与57交换

17.在下列语句中,正确的是( )。

A.char a [3] []= { 'abc','i'};                       B.char a[] [3]={'abc','i'};

C.char a[3] []= {'a',"i"};                            D.char a[] [3]={"a","i"};

解:D

解析:字符串可以这么存储:char a[]="hello world";

18.若下三角矩阵An×n,按列顺序压缩存储在数组Sa[0…(n+1)n/2]中,则非零元素aij的地址为( )。(设每个元素占d个字节,数组下标从0开始)

A.[(j-1)*n+i-1]*d                        B.[(j-1)*n+i]*d

C.[(j-1)*n+i+1]*d                       D.[(j-1)*n+i-2]*d

解:A

19.二维数组和多维数组均不是线性结构。( )

解:正确

解析:

一维数组是线性结构

二维数组就是一种非线性结构(因为是一对多的关系了:a[0]对应两个:a[0][0]、a[0][1])

20.以下排序算法时间复杂度为 O(nlogn) 的是()

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

解:BD

解析:

冒泡排序O(n^2) 

插入排序O(n^2) 

快速排序O(nlogn) 

堆排序O(nlogn) 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来解答你的问题。 首先,我需要明确一下你的问题是什么:对于一个给定的数据序列,如何使用希尔排序算法进行降序排序。 那么,我们先来简单介绍一下希尔排序算法: 希尔排序算法是插入排序算法的一种改进,它利用了插入排序算法对于“几乎有序”的数据序列排序的高效性。希尔排序算法的基本思想是将待排序的数据分成若干个子序列,对每个子序列进行插入排序,然后依次缩小子序列的间隔直到间隔为1,最后对整个数据序列进行插入排序。 下面是使用希尔排序算法进行降序排序的代码实现: ```python def shell_sort(arr): n = len(arr) gap = n // 2 # 初始间隔 while gap > 0: for i in range(gap, n): # 插入排序 temp = arr[i] j = i while j >= gap and arr[j - gap] < temp: arr[j] = arr[j - gap] j -= gap arr[j] = temp gap //= 2 # 缩小间隔 return arr ``` 接下来,我会给你一个例子,使用上面的代码对数据序列进行降序排序: 假设我们有一个数据序列:[5, 2, 8, 4, 9, 1, 3, 7, 6],我们使用希尔排序算法进行降序排序的过程如下: 1. 初始间隔为4,将数据序列分成4个子序列: [5, 9], [2, 1], [8, 3], [4, 7], [9, 6] 2. 对每个子序列进行插入排序,得到新的序列: [9, 5], [2, 1], [8, 3], [7, 4], [9, 6] 3. 缩小间隔为2,将数据序列分成2个子序列: [9, 2, 8, 7, 9], [5, 1, 3, 4, 6] 4. 对每个子序列进行插入排序,得到新的序列: [9, 2, 8, 7, 9], [6, 5, 4, 3, 1] 5. 缩小间隔为1,对整个数据序列进行插入排序,得到降序排列的新序列: [9, 9, 8, 7, 6, 5, 4, 3, 2, 1] 所以,对于给定的数据序列,使用希尔排序算法进行降序排序的结果为:[9, 9, 8, 7, 6, 5, 4, 3, 2, 1]。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值