一、笔记部分:
方法:
排序取下标
快排要点:
1.i,j,指左,指右,一起往中间走,直到相等,其中可能会交换几次,碰见就要与key交换,所以移动的时候也要加i<j,走不动一次就要交换一次,所以后面有一个if(i<j),因为i==j后就跳出循环与左值交换
2.j一定要先走,因为这样采用先指向小于Key的值,如果i先走先指向大于Key的值,然后j走过来后相等,交换,结果把大值交换到最左边了。
寻找第k个一般只用提取一半,看这个值与i,j重合哪个值哪个大哪个小。
必须要加return 否则进入else if后无法有返回值,会报错
方法2优先队列方法(包含堆排序方法):是利用堆实现的,插入和删除都是堆实现(logN)。
push方法是O(N):选前几就开多少长度的数组,数组比较非常常用,但是用堆排序(一个节点的)就是更小的时间复杂度(logN),重建最大堆是(N*logN)
K是2,开一个k=2的数组,遍历数组与新开数组的最小值进行比较比较,如果大于,次数与最小值交换,直到数组遍历完,再将新建数组的最小值提取出来。就是第k大的数
方法三最大堆(平衡二叉树):3ms比选择派少了9ms。
O(NlogN)空间复杂度O(K)
队列实现二叉树。
注意点:
1.最大堆的实现,从有子树的节点开始(size/2)开始与子树比较,将最大值放到父节点,然后依 次往上遍历,直到堆顶,堆顶就是最大值。
2.实现数组的交换,一定要传入数组进去,这样才是地址交换,才有质的变换,所以数组元素的交换肯定会有三个数。
3.调换了顶部的元素,最大值只能从其子树选,所以直接用maxHeap,不需要重新建树。
二、排序类型的高频面试题汇总:
https://blog.csdn.net/qq_40262372/article/details/112643107
三、各种类型的高频面试题汇总:
https://blog.csdn.net/qq_40262372/article/details/112556249
四、如有疑问可加QQ群讨论:725936761 博主免费答疑