剑指offer第二十九题
题目如下
思路与代码
sort()函数解千愁,面试官不愿回眸
很简单,就是排序然后输出,一定要用快排呀
面试这题就是在考里会不会快排,你若是冒泡排序
面试官可能会问你,“我们这里还缺清洁工,你有没有兴趣?”
快排,c++有封装的函数,我们看看用函数能有多简单?
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> ans;
if(k>input.size()) return ans;
sort(input.begin(),input.end());
for(int i=0;i<k;i++){
ans.push_back(input[i]);
}
return ans;
}
};
十年磨一剑,快排永争先(手写快排)
用简单语言来描述一下快排
从左边找到一个大于base的数
从右边找到一个小于base的数
如果这两个数的下标不同,就交换两个数,
这样小的数就到了左边。
当两者遍历到了同一个下标,这个下标和base交换,就可以保证base左边的数都比base小,右边的都比base大,这就是我们要的呀!
然后对前k个数排序就好了
这里有一篇快排很详细的博客推荐给大家!!!
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
快速排序法(详解)
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int n=input.size();
if(k>n) return vector<int>();
quickSelect(input,0,n-1,k);
return vector<int>(input.begin(),input.begin()+k);
}
void quickSelect(vector<int> &input,int left,int right,int k){
if(left>=right) return ;
int l=left,r=right,base=input[left];
while(l<r){
while(input[r]>=base&&l<r){
r--;
}
while(input[l]<=base&&l<r){
l++;
}
if(l<r){
swap(input[l],input[r]);
}
}
input[left]=input[l],input[l]=base;
if(l>k-1){
quickSelect(input,left,l-1,k);
quickSelect(input,l+1,right,k);
}
}
void swap(int &a,int &b){
a^=b;
b^=a;
a^=b;
}
};