面试题40:最小的k个数
快速排序:哨兵划分+递归
class Solution{
public:
vector<int> getLeastNumbers(vector<int>& arr,int k){
quickSort(arr,0,arr.size()-1);
vector<int> res;
res.assign(arr.begin(),arr.begin()+k); // 把first到last的值赋值给调用者;
return res;
}
private:
void quickSort(vector<int>& arr,int l,int r){
if(l>=r)
return; // 子数组长度为1时终止递归;
int i=l,j=r; // 哨兵划分操作(以arr[l]作为基准数);
while(i<j)
{
while(i<j && arr[j] >= arr[l])
j--;
while(i<j && arr[i] <= arr[l])
i++;
swap(arr[i],arr[j]);
}
swap(arr[i],arr[l]); // 交换哨兵
quickSort(arr,l,i-1);
quickSort(arr,i+1,r);
}
};
输入整数数组 arr
,找出其中最小的 k
个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
if(k>=arr.size())
return arr;
return quickSort(arr,0,arr.size()-1,k);
}
private:
vector<int> quickSort(vector<int>& arr,int l,int r,int k){
int i = l,j = r;
while(i<j)
{
while(i<j && arr[j]>=arr[l])
j--;
while(i<j && arr[i]<=arr[l])
i++;
swap(arr[i],arr[j]);
}
swap(arr[i],arr[l]);
if(i>k) // 如果i>k,说明此时哨兵位置大于要求得到数字的数量,再递归排序i之前的子数组
quickSort(arr,l,i-1,k);
if(i<k) // 如果i<k,说明此时哨兵位置小于要求得到数字的数量,再递归排序i之后的子数组
quickSort(arr,i+1,r,k);
vector<int> res;
res.assign(arr.begin(),arr.begin()+k);
return res;
}
};