局部有序,使用直接插入比较好
快排适用于大量无序数据
A
C
C
比较次数:画了n个括号,每一次画括号都要选出一个最大值
移动次数:已经排序号的元素是不需要移动的,只需要在选择出极值之后,将极值,与括号头的元素互换位置
B
C
但是希尔排序在最坏情况下的时间复杂度也是O(N^2)
A
C
C
快速排序想要减少递归深度,需要先处理短的序列:因为长的序列,短的序列,在栈中存的都是指针,大小是一样的,但是如果先处理长的,因为只能一个提个的处理,所以必须要不断的分解为很多小的,然后不断地存入栈中,这样就会加大栈的深度,也就是算法的递归深度(这里的递归深度,不是指递归树的深度,而是指栈的深度)
BD
堆排序,平均时间复杂度和最坏时间复杂度都是O(N*logN)
O(n^2) - O(n) == O(n^2)
答案是A,但是我觉得应该是选择AB
堆是层次遍历,而不是投影遍历(中序遍历),按照层次遍历的话,堆顶一定在数组的首部
二叉树中,叶子节点数一定等于分支节点数+1
如果节点数为n,则n/2向下取整及之前都是分支节点(从1开始),n/2向下取整+1以及之后为叶子节点
建堆要从最后一个分支节点进行筛选,一共有n/2向下取整个分支节点,所以需要进行有n/2向下取整次筛选
D 堆使用层次遍历描述
B
建立堆的过程:先不做任何改变,以层序遍历的方式建立二叉树,然后从第一个分支节点开始向前调整,每次调整只负责将所涉及到的结点为根节点的子树调整完毕,向下调整,一直推到底,但是不向上推
如果是大根堆,就与大的调整,如果是小根堆,就与小的调整
B
C
C
归并排序需要进行log(N),向上取整趟
每一项都与其他项进行比较,计算出小于该项的项的个数,以确定该项的位置,叫做枚举排序
A
堆排序:O(1)
快速分类(调用栈):O(logN)
归并分类:O(N)
C
BC
平均时间复杂度为O(N*logN)的算法:归并排序,堆排序,快速排序
个数较大,基数较小的时候,适合使用基数排序
A
A
最坏情况下的时间复杂度能达到的最好下界,等同于,最好的最坏时间复杂度:
冒泡排序,插入排序(直接插入,折半插入排序),选择排序,希尔排序,最坏情况下的时间复杂度都是O(N^2);
堆排序,归并排序,最坏情况下的时间复杂度为O(N*logN)
基数排序(P(N+B)) P为趟数,也就是数字的位数,B为基数,十进制就是10
时间下界,指的是最好情况下的时间下界:
组与组之间相对有序,只需要将各个组分别排序即可.
O(k*log(k)) * (n/k) = O(n * log k)
不会做
C
转载于:https://juejin.im/post/5b9b1c5ee51d450e67492f52