排序算法千变万化
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;
}