昨天更新完各种排序之后今天来检验一下是否真的全部掌握了呢?
今天的合集里面包括各种排序的综合选择题和一些解题技巧
花一两分钟看一下真的很有帮助哦
(最好能先认真复习一下各种排序)
1.
冒泡排序就是相邻元素的两两比较所以依次写出来就可以了
第一趟:456321——453621——453261——453216
第二趟:453216——435216——432516——432156
第三趟:432156——342156——324156——321456
所以321456就是最后的结果
选择排序:假设第一个数据是最值,然后后面的数据依次和他比较,如果有更大或者更小则替换
计算比较次数的方法和冒泡排序一样,第一次有n-1个元素要进行比较,也就是n-1次
往后依次减少,每次减少1,首项是n-1 尾项1,项数n-1的等差数列
总次数N=(n-1+1)*(n-1)/2
所以该题答案清晰明了,100*99/2=4950
降序应该建小堆,通过建堆算法向下调整
5 5 2 2
11 7 —— 2 7 ——5 7 ——3 7
2 3 17 11 3 17 11 3 17 5 11 17
所以结果就是2 3 7 5 11 17
题目的意思就是把28当做key,右面先找小,然后左边找大交换
28 16 32 12 60 2 5 72
28 16 5 12 60 2 32 72
2 16 5 12 28 60 32 72
这道题就需要知道每一趟快排之后的结果特点
每一次快排都会至少让一个元素确定位置
发现只有C
有序的时候应该是2345679 和选项对比发现就只有9在应在的位置上 所以错误
快排的额外空间就是logn 因为他是类似于二叉树(逻辑结构)一样的结构往下建立栈帧,树高度是n 所以额外的空间就是logn
判断对错:
A就是最初创造出三数取中的初衷,就是为了规避快排对接近有序的序列的极大浪费情况
B如果元素完全相同那还需要更优化的方法,这个方法在各类排序的博客里已经写过了
各种排序里面的
C没问题就是三数取中的定义
D肯定不对,就像我在上篇博客里面说过的,叫做快排也不是最快的,就算是还有三数取中解决不了的B的问题
选错的
非递归我们是用栈完成的,但是栈和队列根本就没有本质区别,甚至之前我们还一起做了栈和队列相互转化的oj,所以AB没大问题
C非递归在时间复杂度上并没有很大的改善,但是在空间复杂度上就节省了特别多开辟栈帧的开销,退一步,如果真的非递归又节约时间还节约空间,那只学他不就行了
D根据C的分析,对的
还有个汇总
有很多考最好最坏,时间复杂度的题目在这里就不列举了
我们最直接用一张表说话
已经有序的情况下花费最多的是快排
这个题目是一种新的排序方法(不在那片汇总的博客里)
这个是快排的二分排序思想
今天的内容就到这里,感谢