//快排
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> ans;
if(k==0)return ans;
int le=0,r=input.size()-1;
quick_sort(input,le,r);
for(int i=0;i<k;i++)
{
ans.push_back(input[i]);
}
return ans;
}
void quick_sort(vector<int>& input,int le,int r)
{
if(le==r)return ;//因为while循环处找的i和j不会越过边界,用等于就行
int mid = le+(r-le)/2;
//用中间的数而是开头只是想中间的时间复杂度可能低点
int k = input[mid];
int i=le-1,j=r+1;//为了防止第一个元素和最后一个元素不参加比较
while(i<j)
{
//之所以使用i++和j--是因为一旦出现重复元素会出现死循环
//为了使交换完元素后两指针移动
do i++;
//使用<而不是<=是为了防止i直接越界,如【0,1,2,1,2】;
while(input[i]<k);//
do j--;//下同理
while(input[j]>k);
if(i<j)swap(input[i],input[j]);
}
//此处的i和j有两种情况:
//1.i==j:那么左边界[le,i],右[i+1,r]或左[le,j],右[j+1,r]; 如:(1,2,3)
//2.i>j:那么需要左边界[le,j],右[j+1,r] 或者左[le,i-1],右[i,r]; 如(6,6)
//综上使用左[le,j],右[j+1,r]
quick_sort(input,le,j);//其实当i==j的时候,i和j都类似mid向下取整
quick_sort(input,j+1,r);
}
};