leedcode 215. 数组中的第K个最大元素
快排每次寻找都会确定一个元素的真实位置
快排的思想:

先定第一个位置是坑,取出第一个位置的值作为最终要确定位置的值,设置up指针和down指针

由于一开始坑的位置和up重合,直接判断坑的值和down的值大小,此时坑>down需要换坑位置,交换以后down的值付给原来的坑,新坑的位置和down重合,up后移一个

再比较,up<坑,继续后移up一个单位;此时up>坑,需要换坑的位置,此时的up值赋给旧坑,up的位置变成新坑,以此类推。
代码:

class Solution {
public:
int deal(int donser[],int k,int num)
{
int up,down,out,sit,*lable;
lable=new int[num];
for(int ii=0;ii<num;ii++)
lable[ii]=0;
while(1)
{
up=0;//找up down位置
down=num-1;
for(int i=0;i<num;i++)
{
if(lable[i]==0)
{
up=i;
break;
}
}
for(int i=num-1;i>0;i--)
{
if(lable[i]==0)
{
down=i;
break;
}
}
out=donser[up];//要确定位置的值
sit=up;//坑
while(up<down)
{
if(sit==up)
{
if(out<=donser[down])
{
down--;
continue;
}
if(out>donser[down])
{
donser[sit]=donser[down];
donser[down]=out;
sit=down;
up++;
continue;
}
}
else if(sit==down)
{
if(out>=donser[up])
{
up++;
continue;
}
if(out<donser[up])
{
donser[sit]=donser[up];
donser[up]=out;
sit=up;
down--;
continue;
}
}
}
lable[sit]=1;
if(sit==num-k)
break;
}
return donser[sit];
}
int findKthLargest(vector<int>& nums, int k) {
int i=nums.size(),*donser;
donser=new int[i];
for(int c=0;c<i;c++)
donser[c] = nums[c];
if(i==1)
return donser[0];
return deal(donser,k,i);
}
};
快速实现代码:

#include<algorithm>
#include<string.h>
int qsor(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int i=nums.size(),*donser;
donser=new int[i];
for(int c=0;c<i;c++)
donser[c] = nums[c];
qsort(donser,i,sizeof(int),qsor);
return donser[i-k];
}
};
来源:https://www.cnblogs.com/dzzy/p/12241585.html
