题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
- 算法:快速(分组)排序
- 数据结构:数组
- 编程语言:C++
class Solution {
public:
vector<int> result;
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
if(input.size()<=0||k<=0|k>input.size())//输入合理性
return result;
int length=input.size();
int start=0;
int end=length-1;
int index=Partition(input,length,start,end);//获取起始位置的合理坐标,右边都比它大
while(index!=k-1)//第k个元素
{
if(index>k-1)//在k的右侧
{
end=index-1;
index=Partition(input,length,start,end);
}
else//在k的左侧
{
start=index+1;
index=Partition(input,length,start,end);
}
}
for(int i=0;i<k;i++)
result.push_back(input[i]);
return result;
}
//重点是&,该函数用于把获取start的位置
int Partition(vector<int> &data,int length,int start,int end)
{
if(data.size()==0||end>=length||start<0)
return -1;
int index=start;
Swap(&data[index],&data[end]);
int small=start-1;
for(int index=start;index<end;++index)
{
if(data[index]<data[end])
{
++small;
if(small!=index)
Swap(&data[index],&data[small]);
}
}
++small;
Swap(&data[small],&data[end]);
return small;
}
int RandomInRange(int start ,int end)
{
if(end>start)
{
srand(time(NULL));// srand函数是随机数发生器的初始化函数,使得随机数种子随时间的变化而变化
return start+rand() %((end-start));//产生start~end之间的随机数
}
return 0;
}
//交换
void Swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
};