C++算法之排序算法

排序算法千变万化

1. 排序

1.快速排序

//采用左闭右闭的二分写法
void quick_sort(vector<int>&nums,int l,int r){
    if(l+1>r){
    return;
    }
    int first=l,last=r-1,key=nums[first];
    while(first<last){
        while(first<last&&nums[last]>=key){
            --last;
        }
        nums[last]=nums[first];
    }
    nums[first]=key;
    quick_sort(nums,l,first);
    quick_sort(nums,first+1,r);
}    

2.归并排序

void merge_sort(vector<int>&nums,int l,int r,vector<int>&temp){
    if(l+1>=r){
        return;
    }
    //devide
    int m=l+(r-1)/2;
    merge_sort(nums,l,m,temp);
    merge_sort(nums,m,r,temp);
    //conquer
    int p=l,q=m,i=l;
    while(p<m||q<r){
        if(q>=r||(p<m&&nums[p]<=nums[q])){
            temp[i++]=nums[p++];
        }
        else{
            temp[i++]=num[q++];
        }
    }
    for(i=l;i<r;i++){
        num[i]=temp[i];
    }
}

3.插入排序

void insertion_sort(vector<int>&nums,int n){
    for(int i=0;i<n;++i){
        for(int j=i;j>0&&nums[j]<nums[j-1];--j){
            swap(nums[j],nums[j-1]);
        }
    }
}

4.冒泡排序

void bubble_sort(vector<int>&nums,int n){
    bool swapped;
    for(int i=1;i<,n;++i}
        swapped=false;
        for(int j=1;j<n-i+1;++j){
            if(nums[j]<num[j-1]){
                swap(nums[j],nums[j-1]
                swapped=true;
            }
        }
        if(!swapped){
            break;
        }
    }
}

5.选择排序

void selection_sort(vector<int>&nums,int n){
    int mid;
    for(int i=0;i<n-1;++i){
        mid=i;
        for(int j=i+1;j<n;++j){
            if(nums[j]<nums[mid]){
                mid=j;
            }
        }
        swap(nums[mid],nums[i]);
    }
}

以上代码调用方法:

void sort() {
vector<int> nums = {1,3,5,7,2,6,4,8,9,2,8,7,6,0,3,5,9,4,1,0};
vector<int> temp(nums.size());
sort(nums.begin(), nums.end());
quick_sort(nums, 0, nums.size());
merge_sort(nums, 0, nums.size(), temp);
insertion_sort(nums, nums.size());
bubble_sort(nums, nums.size());
selection_sort(nums, nums.size());
}

2.快速选择

1.题目
输入一个数组和一个目标值k,输出第k大的数字,题目默认一定有解
在这里插入图片描述

//辅函数-快速选择
int quickSelection(vector<int>&nums,int l,int r){
    int i=l+1,j=r;
    while(true){
        while(i<r&&nums[i]<=nums[l]){
            ++i;
        }
        while(l<j&&nums[j]>=nums[l]){
            --j;
        }
        if(i>=j){
            break;
        }
        swap(nums[i],nums[j]);
    }
    swap(nums[l],nums[j]);
    return j;
}
//主函数
int findKthLargest(vector<int>&nums,int k){
    int l=0,r=nums.size()-1,target=nums.size()-k;
    while(l<k){
        int mid=quickSelection(nums,l,r);
        if(mid==target){
            return nums[mid];
        }
        if(mid<target){
            l=mid+1;
        }
        else{
            r=mid-1;
        }
    }
    return nums[l];
}           

3.桶排序

顾名思义,桶排序的意思是为每个值设立一个桶,桶内记录这个值出现的次数(或其它属
性),然后对桶进行排序。

题目:输入是一个数组和一个目标k,输出是一个长度为k的数组
在这里插入图片描述

vector<int>topKFrequent(vector<int>&nums,int k){
    unordered_map<int,int>counts;
    int  max_count=0;
    for(const int&num:nums){
        max_count=max(max_count,++counts[num];
    }
    vector<vector<int>>buckets(max_count+1);
    for(const auto&p:counts){
        buckets[p.second].push_back(p.first];
    }
    vector<int>ans;
    for(int i=max_count;i>=0&&ans.size()<k;--i){
        for(const int&num:bucket[i]){
            ans.push_back(num);
            if(ans.size()==k){
                break;
            }
        }
    }
    return ans;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月醉窗台

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值