快速排序算法 归并排序算法 C++实现

快速排序

这里按从大到小排序,

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];
    }

};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值