算法与数据结构1800题

排序算法对比

A 空间复杂度:
选择排序:仅使用常数个存储单元(temp),O(1)
冒泡排序:仅使用常数个存储单元(temp),O(1)
直接插入:仅使用常数个存储单元(temp),O(1)
希尔排序:仅使用常数个存储单元(temp),O(1)
堆排序:删除最大元素之后,直接放在数组的末尾,一边删除一边形成了有序数组,仅需要常数个存储空间
快速排序: 由于快速排序是递归的,需要借助一个递归工作栈来保存递归所需要的信息,其容量与递归调用的最大深度相同,最好情况下为log(N+1)向上取整, 最坏情况下为O(N)
归并排序:递归+归并两个数组都需要空间,递归所需要的空间为O(logN),归并所需要的空间为O(N),所以取最大值,为O(N)
基数排序:需要的空间(基数值+N个元素)

D
快速排序,当初始序列基本有序的时候,最不利于发挥其优势,越能够等分待排序数组,越高效

待排序列基本有序:直接插入是最有效的,冒泡排序,如果是前面基本有序,最后一个元素是最小,则需要大量的交换,堆排序也不错,但是不如直接插入好,归并排序,初始是否有序无关

C
在十分接近有序的序列中,各种算法的时间复杂度,不一定等于最优时间复杂度:
插入排序: O(N)
归并排序,与是否有序无关,O(N*logN)
快速排序,越有序,越低效,由于采用了首元素作为pivot,所以每次都只有一面,这样的话,时间复杂度就为最差时间复杂度O(N^2)

C
对于ABD,数组首尾应该是有序,而且是有序极值

B
排序算法的时间复杂度,与需要比较的次数相关,与存储结构,是否稳定排序是无关的

A
选择排序,冒泡排序,堆排序,极值必定出现在尾部
快速排序,必有pivot
希尔排序,必定间隔有序
归并排序,必定成组有序
折半插入,直接插入,一端有序

C

C

A

A
判断是不是快速排序:找pivot

AD
希尔排序,直接插入排序,在一趟排序结束之后,都不一定能选出一个元素在其最终位置上

C

D

ACD

C

B 答案给的是快速排序,牛客网上给出的答案是基数排序

浙大版的快排和严蔚敏版的快速排序是不一样的:

浙大: 先定位到两个不合理的元素,然后将这两个元素进行互换
严蔚敏:将pivot赋值给temp,然后先移动high指针,找到不合理元素后,将A[low]替换,然后移动low指针,找到不合理的元素后,替换掉high指针所指向的元素,交替移动high,low指针,找到不合理的,就像踢皮球一样将对方指针给覆盖,low指针从最开始的low开始,当满足A[low/high] >= / <= pivot的时候,就进行互换,而不是只有满足 > 或者<的时候才进行互换
外层while循环的条件为:low < high,而不是low <= high,即当low指针与high指针重合的时候就退出循环,然后用pivot替换A[low/high]

BCD

D 排序分为:插入,交换,选择,基数排序和归并排序
插入:直接插入,折半插入,希尔排序
交换:冒泡排序,快速排序
选择:简单选择,堆排序
基数排序和归并排序

冒泡排序,选择排序,堆排序都可以部分得出结果(根据答案,好像快速排序也是可以的)
这三种方法进行比较,堆排序是最快的(logN)

C
同上

C

A

D

A

D
本题易错:
如果遇到7,8,9,1这样的冒泡序列,那么每次冒泡还是会讲一个元素放到正确的位置上

C

B

转载于:https://juejin.im/post/5b9a1be66fb9a05cd456cde8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值