快速排序
这里按从大到小排序,
void quick_sort(vector<int>& nums,int l,int r) //这里l一般为0,r为数组大小-1
{
if(l>=r) return; //边界判定
int i=l-1,j=r+1,x=nums[(l+r)/2]; //因为用的是do-while循环所以给左指针-1,右指针+1
while(i<j)
{
do i++;while(nums[i]>x); //找到一个小于目标值的的下标
do j--;while(nums[j]<x); //找到一个大于目标值的下标
if(i<j) swap(nums[i],nums[j]); //交换
}
quick_sort(nums,l,j); //继续递归
quick_sort(nums,j+1,r);
}
参考例题
leetcode
215.数组中的第K个最大元素
class Solution {
public:
void quick_sort(vector<int>& nums,int l,int r)
{
if(l>=r) return;
int i=l-1,j=r+1,x=nums[(l+r)/2];
while(i<j)
{
do i++;while(nums[i]>x);
do j--;while(nums[j]<x);
if(i<j) swap(nums[i],nums[j]);
}
quick_sort(nums,l,j);
quick_sort(nums,j+1,r);
}
int findKthLargest(vector<int>& nums, int k) {
quick_sort(nums,0,nums.size()-1);
return nums[k-1];
}
};
归并排序
这里按从大到小排序,
vector<int> temp; //辅助数组
void merge_sort(vector<int> &nums,int l,int r) //左闭右闭
{
if(l>=r)return;
int mid=(l+r)/2; //找分界点
merge_sort(nums,l,mid); //归并递归
merge_sort(nums,mid+1,r);
int k=0,i=l,j=mid+1; //k用来操作辅助数组
while(i<=mid&&j<=r)
{
if(nums[i]>=nums[j]) temp[k++]=nums[i++];//排序
else temp[k++]=nums[j++];
}
//下面2个while 是来将未循环完的直接接到答案里去,一般起作用的只有一个while
while(i<=mid) temp[k++]=nums[i++];
while(j<=r) temp[k++]=nums[j++];
for(i=l,j=0;i<=r;i++,j++)nums[i]=temp[j]; //将辅助数组的值返回到原数组
}
参考例题
leetcode
215.数组中的第K个最大元素
class Solution {
public:
vector<int> temp;
void merge_sort(vector<int> &nums,int l,int r)
{
if(l>=r)return;
int mid=(l+r)/2;
merge_sort(nums,l,mid);
merge_sort(nums,mid+1,r);
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r)
{
if(nums[i]>=nums[j]) temp[k++]=nums[i++];
else temp[k++]=nums[j++];
}
while(i<=mid) temp[k++]=nums[i++];
while(j<=r) temp[k++]=nums[j++];
for(i=l,j=0;i<=r;i++,j++)nums[i]=temp[j];
}
int findKthLargest(vector<int>& nums, int k) {
temp.resize(nums.size());
merge_sort(nums,0,nums.size()-1);
return nums[k-1];
}
};