算法思想:
给出一个数组,选出数组中第K大的元素。
1.采用快速排序的划分策略将数组划分成两个子数组。
2.如果数组1的个数大于K则第K个元素在数组1中。
3如果数组1的个数小于K则第K个元素在数据2中。
3.如果等于k 则找到第K大的元素。
代码如下:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
/*
基准选择:data[left] data[center] data[right] 的值进行比较
1. data[left]=min(data[right],data[left],data[mid])
2. data[right]=max(data[right],data[center],data[left])
3. data[center]=median(data[left],data[right],data[center])
4. 将data[center]放置在data[right-1]
*/
int median(vector<int> &data,int left,int right){
int center=(left+right)/2;
if(data[left]>data[center])
swap(data[left],data[center]);
if(data[left]>data[right])
swap(data[left],data[right]);
if(data[center]>data[right])
swap(data[center],data[right]);
swap(data[center],data[right-1]);
return data[right-1];
}
int partition(vector<int> &data,int left,int right){
int pivot=median(data,left,right);
int i=left,j=right-1;
while(1){
while(data[++i]<pivot){}//从data[left+1]
while(data[--j]>pivot){}//从data[right-2]
if(i<j)
swap(data[i],data[j]);
else
break;
}
swap(data[i],data[right-1]);
return i;
}
/*快速选择算法*/
void quick_select(vector<int> &data,int k,int left,int right){
if(left<right){
int mid=partition(data,left,right);
if(k<mid)
quick_select(data,k,left,mid-1);
else if(k>mid)
quick_select(data,k,mid+1,right);
else
return ;
}
}
int main(){
int d[]={1,2,3,2,2,2,5,4,2};
vector<int> data(d,d+9);
quick_select(data,8,0,8);
for(int i=0;i<9;++i)
cout<<data[i]<<" ";
return 0;
}