1.排序理论
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iw9JbiQc-1644592461318)(/Users/xuguagua/Library/Application Support/typora-user-images/image-20220112160343390.png)]
题目:215
2.八大排序算法
2.1_快速排序
2.1.1 算法描述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dUtrPpcG-1644592461321)(/Users/xuguagua/Library/Application Support/typora-user-images/image-20220112160524555.png)]
关键:有两个指针 i,j 。有一个 temp ,先判断 j 再判断 i ,当“满足”时,i 或 j 就移动,不满足时 i,j 交换位置
2.1.2 代码实现
class Solution {
public:
void quick_sort(vector<int>&nums,int left,int right){
if(left<right){ // 结束递归的条件
int i = left;
int j = right;
int temp = nums[left];
// 开始快速遍历
while(i<j){
// 先判断 j
while(i<j&&nums[j]>=temp) j--; // 如果 j 指向元素一直>= temp 就不交换
if(i<j){ // 不满足上述条件了
nums[i] = nums[j]; // 将 j 放在 i 上,j 的位置变为 x
i++; // i 的 x 被占了,开始进行 i 的判断
}
// 然后判断 i
while(i<j&&nums[i]<temp) i++;
if(i<j){
nums[j] = nums[i]; // 将 j 放在 i 的 x 上
j--; // j 的坑被占,继续 j 的判断
}
}
nums[i] = temp; // i,j 都遍历完成后将 temp 放在 i 的位置,因为最后 i 上是挖坑了的
// 将 temp 为分界点然后对剩余的左右量变数组进行遍历操作
quick_sort(nums,left,i-1); // nums 左边
quick_sort(nums,i+1,right); // nums 右边
}
}
int findKthLargest(vector<int>& nums, int k) {
// 对 nums 进行排序
quick_sort(nums,0,nums.size()-1);
// 取前 k 个值
return nums[nums.size()-k];
}
};
2.2 排序链表
这个 cut 操作传入一个 cur ,每次都会传入一个 2 的倍数,就拿第一次 cut 来说。它会走两遍 next 。然后再返回 next
所以就会有下图的一个形状