算法--排序

加一
第十一章 28

给一个由包含一串数字的列表组成的非负整数加上一。
注意点:列表前面的数字表示高位 ,注意最高位也可能进位。

例子:
输入: [1, 2, 3, 4, 9]
输出: [1, 2, 3, 5, 0]
解题思路:
用一个 int 数组代表一个数值,最左边是最高位,现要求加上 1,同样地返回一个 int 数组代表计算结果。非常简单的模拟加法,注意进位问题,如果是 99,999 这种,最后加上 1 后还要在数组最左边
插入一个元素 1。

// An highlighted block
class Solution:
    def plusOne(self,digits):
        len_s=len(digits)
        carry =1
        for i in range(len_s-1,-1,-1):
            total = digits[i]+carry
            digit = int(total%10)
            carry = int(total/10)
            digits[i] =digit
        if 1 == carry:
            digits.insert(0,1)
        return digits

if __name__== '__main__':
    a = Solution()
    digits = [1,1,2,8,9]
    print(a.plusOne(digits))

----2020/3/12

----设一组初始记录关键字序列(Q,H,C,Y,P,A,M,S,R,D,F,X),则按字母升序的第一趟冒泡排序结束后的结果是()
正确答案: D
F,H,C,D,P,A,M,Q,R,S,Y,X
P,A,C,S,Q,D,F,X,R,H,M,Y
A,D,C,R,F,Q,M,S,Y,P,H,X
H,C,Q,P,A,M,S,R,D,F,X,Y

解析:一趟冒泡排序,是将“大的”字母沉底
首先:Q与H比较
H,Q,C,Y,P,A,M,S,R,D,F,X
然后Q与C比较
HCQYPAMSRDFX
Q与Y比较,Q不动,
之后Y与P比较,接下来的比较是:
H,C,Q,P,Y,A,M,S,R,D,F,X
H,C,Q,P,A,Y,M,S,R,D,F,X
H,C,Q,P,A,M,Y,S,R,D,F,X
H,C,Q,P,A,M,S,Y,R,D,F,X
H,C,Q,P,A,M,S,R,Y,D,F,X
H,C,Q,P,A,M,S,R,D,Y,F,X
H,C,Q,P,A,M,S,R,D,F,Y,X
H,C,Q,P,A,M,S,R,D,F,X,Y
至此,一趟冒泡排序完成。

----排序的方法有很多种,()法是基于选择排序的一种方法,是完全二叉树结构的一个重要应用。

正确答案: E
快速排序
插入排序
归并排序
选择排序
堆排序
解析:堆排序是一种树形选择排序,是对直接选择排序的有效改进。
初始时把要排序的n个数的序列看作是一棵顺序存储的二叉树(一维数组存储二叉树),调整它们的存储序,使之成为一个堆,将堆顶元素输出,得到n个元素中最小(或最大)的元素,这时堆的根节点的数最小(或者最大)。然后对前面(n-1)个元素重新调整使之成为堆,输出堆顶元素,得到n个元素中次小(或次大)的元素。依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列。称这个过程为堆排序。

----某种排序方法对关键字序列(33,12,44,10,6,8,17)进行排序时,前三趟排序的结果如下:

6,12,44,10,33,8,17

6,8,44,10,33,12,17

6,8,10,44,33,12,17
则采用的排序方法是()
正确答案: D

希尔排序
归并排序
快速排序
选择排序

解析:选择排序:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换…第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成。

----在排序算法中,每次从未排序的记录中挑出最小(或最大)关键码字的记录,加入到已排序记录的末尾,该排序方法是()
正确答案: A
选择
起泡
插入
快排

解析:选择排序的思想就是每次从剩余序列中选出最小的元素排在序列的第一位,一直到待选择序列长度为0。

合并排序相对于快速排序的优点不包括()

正确答案: C
是稳定的
最坏的情况更高效
空间复杂度低
不会退化

解析:合并排序就是归并排序,空间复杂度为 o(n)
快速排序,空间复杂度是 o(logn)

----将整数数组(7-6-3-5-4-1-2)按照堆排序的方式原地进行升序排列,请问在整个排序过程中,元素3的数组下标发生过____次改变。
正确答案: C
0
1
2
3
4
5
解析:在这里插入图片描述
在这里插入图片描述

----以下属于稳定排序的是()
正确答案: A D
归并排序和基数排序
快速排序和堆排序
选择排序和希尔排序
插入排序和冒泡排序

解析:稳定排序:在这里插入图片描述

----2020/4/5

----题目来源于王道论坛

对一组数据(2,12,16,88,5,10)进行排序,若前三趟排序结果如下:
第一趟排序结果:2,12,16,5,10,88
第二趟排序结果:2,12,5,10,16,88

第三趟排序结果:2,5,10,12,16,88

则采用的排序方法可能是()。

正确答案: A
冒泡排序
希尔排序
归并排序
基数排序
解析:中所给的三趟排序过程中,每一趟排序是从前往后依次比较,使最大值“沉底”,符合冒泡排序的特点。

----在以下排序算法中,关键字比较的次数与记录的初始排列次序无关的是()。
正确答案: D
希尔排序
冒泡排序
插入排序
直接选择排序
解析:选择排序每次都需要遍历剩下的序列 找出最大或最小值进行与当前位置的交换 无论什么情况下时间复杂度都为O(N2) 并且选择排序是不稳定排序。

----如果待排序序列中两个数据元素具有相同的值,在排序前后它们的相互位置发生颠倒,则称该排序算法是不稳定的()就是不稳定的排序方法
正确答案: C E
起泡排序
归并排序
希尔排序
直接插入排序
简单选择排序
解析:基数排序,归并排序,冒泡排序,插入排序是稳定的。

----2020/4/7

----快速排序的平均时间复杂度为( )?
正确答案: B
O(n)
O(nlog(n))
O(log(n))
O(n^2)
解析:

----对于排序算法,经常关注的是其时间复杂度和稳定性。下列排序算法中平均时间复杂度是O(NLOGN)且稳定的是?
正确答案: B
插入排序
归并排序
堆排序
快速排序
解析:
不稳定的算法:快(快速排序)、些(希尔排序)、选(选择排序)、队(堆排序)
平均时间复杂度为O(nlog2n):快速排序、归并排序、堆排序

归并排序,堆排序和快速排序都可以达到O(nlogn)但是堆排序和快速排序是不稳定的。

----下面哪些是稳定排序
正确答案: A D
冒泡排序
快速排序
堆排序
归并排序
选择排序
解析:快(快速排序)些(希)来选(选择排序)一堆(堆排序)美女–不稳定

----在待排数据基本有序的情况下,快速排序效果最好()
正确答案: A


解析:在待排数据基本有序的情况下,直接插入排序方法是效果最好。所以选A

----就分类算法所用的辅助空间而言,堆分类、快速分类和归并分类的关系是()
正确答案: A
堆分类<快速分类<归并分类
堆分类<归并分类<快速分类
堆分类>归并分类>快速分类
堆分类>快速分类>归并分类
解析:在这里插入图片描述

----对{05,46,13,55,94,17,42}进行基数排序,一趟排序的结果是:()
正确答案: C
05,46,13,55,94,17,42
05,13,17,42,46,55,94
42,13,94,05,55,46,17
05,13,46,55,17,42,94
解析:即从最低位开始排序,然后由最低位到最高位依次排序。

----设一组初始记录关键字序列为(45,80,55,40,42,85),则以第一个记录关键字45为基准而得到一趟快速排序的结果是()。

正确答案: C
40,42,45,55,80,85
42,40,45,80,85,55
42,40,45,55,80,85
42,40,45,85,55,80
解析:原序列:45,80,55,40,42,85
第一次:从后往前 查找比45小的数 42比45小 他俩交换位置:42,80,55,40,45,85
第二次:从前往后 找比45大的数 80>45 交换位置:42,45,55,40,80,85
第三次:从后往前 找比45小的数 40<45 交换位置:42,40,55,45,80,85
第四次:从前往后 找比45大的数 55>45 交换位置:42,40,45,55,80,85

----有字符序列(Q,H,C,Y,P,A,M,S,R,D,F,X),新序列(F,H,C,D,A,M,P,S,R,Y,Q,X)是下列( )排序算法一趟扫描结果。
正确答案: B
堆排序
快速排序
希尔排序
冒泡排序
解析:一趟快速排序意思是:寻找一个支点,将该序列位置整个调整一边,可以看到M是支撑点,左边都是比M小的,右边都是比M大的,
注意:支点不一定是左边第一个数,可以任意选的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值