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