堆排序
#include<iostream>
#include <string.h>
#include<cstring>
#include<limits.h>
#include<vector>
#include<algorithm>
using namespace std;
void headjust(int a[],int k,int len);
void buildmaxheap(int a[],int k,int len){
for(int i=len/2;i>=1;i--){//从末到头建堆
headjust(a,i,len);
}
}
void headjust(int a[],int k,int len){
a[0]=a[k];
for(int i=2*k;i<=len;i*=2){
if(i<len && a[i]<a[i+1]) ++i;//找子树中较大的
if(a[0]>=a[i]) break;
a[k]=a[i];//调换位置
k=i;
}
a[k]=a[0];
}
void heapsort(int a[],int len){
buildmaxheap(a,1,len);//初始堆
for(int i=len;i>0;i--){
cout<<a[1]<<' ';
swap(a[i],a[1]);
headjust(a,1,i-1);//对剩下的堆排序
}
}
int main(){
int a[]={0,53,17,78,9,45,65,87,32};
heapsort(a,8);
}
215
用枢轴两侧数的位置交换排序,不断选中正确的下标
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int n=nums.size();
int l=0,r=n-1,target=n-k;
while(l<r){
int mid=quicksort(nums,l,r);
if(target==mid) return nums[mid];
if(mid<target) l=mid+1;
else r=mid-1;
}
return nums[r];
}
int quicksort(vector<int>& nums,int l,int r){
int i=l+1,j=r;
while(1){
while(i<r && nums[i]<=nums[l]) ++i;
while(j>l && nums[j]>=nums[l]) --j;
if(i>=j) break;
swap(nums[i],nums[j]);
}
swap(nums[l],nums[j]);
return j;
}
};
347
先把频率记录下来,再用频率作为下标排序
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
vector<int> ans;
unordered_map<int,int> cnt;
int max_cnt=0;
for(auto & it:nums){
max_cnt=max(max_cnt,++cnt[it]);
}
vector<vector<int>> buckets(max_cnt+1);
for(auto & q:cnt){
buckets[q.second].push_back(q.first);
}
for(int i=max_cnt;i>=0 && ans.size()<k;i--){
for(auto & it:buckets[i]){
ans.push_back(it);
if(ans.size()==k) return ans;
}
}
return ans;
}
};
451
与上题类似
class Solution {
public:
string frequencySort(string s) {
unordered_map<int,int> cnt;
int max_cnt=0;
for(auto & it:s){
max_cnt=max(max_cnt,++cnt[it]);
}
vector<vector<int>> buckets(max_cnt+1);
for(auto & q:cnt){
buckets[q.second].push_back(q.first);
}
string ans;
for(int i=max_cnt;i>=0;i--){
for(auto q:buckets[i]){
for(int j=0;j<i;j++) ans.push_back(q);
}
}
return ans;
}
};
75
双指针分割
class Solution {
public:
void sortColors(vector<int>& nums) {
int n=nums.size();
int p0=0,p1=0;
for(int i=0;i<n;i++){
if(nums[i]==1){
swap(nums[i],nums[p1]);
++p1;
}else if(nums[i]==0){
swap(nums[i],nums[p0]);
if(p0<p1) swap(nums[i],nums[p1]);
++p0,++p1;
}
}
}
};
class Solution {
public:
void sortColors(vector<int>& nums) {
int n=nums.size();
int l=0,r=n-1;
for(int i=0;i<n;i++){
while(i<=r && nums[i]==2){//头尾指针逼近
swap(nums[i],nums[r]);
--r;
}
if(nums[i]==0){
swap(nums[l],nums[i]);
++l;
}
}
}
};