您的位置:首页 > 其它

最小的K个数

2016-07-14 15:58 288 查看

最小的K个数

时间限制:1秒

空间限制:32768K

本题知识点: 数组

题目描述

输入n个整数,找出其中最小的K个数。

例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

牛客网题目链接:点击这里

方法一:

VS2010代码:

#include<iostream>
#include<vector>
using namespace std;

class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> KNum;
int InputNum=input.size();
if(InputNum==0 || k==0 || k>InputNum) return KNum;
KNum.assign(input.begin(), input.begin()+k );
//对这K个数进行快速排序。
QuickSort(KNum, 0, k-1);
//用插入算法对后面的数进行遍历
for(int i=k; i<InputNum; i++ )
{
if(input[i]<KNum[k-1])
{
int j=k-1;
for(; input[i]<KNum[j-1] && j>0; j--)
{
KNum[j]=KNum[j-1];
}
KNum[j]=input[i];
}
}
return KNum;

}
void QuickSort(vector<int> &Array, int begin, int end)
{
if(begin>=end) return;
int temp=Array[begin];
int i=begin,j=end;
while(i<j)
{
while(i<j && Array[j]>temp) j--;
while(i<j && Array[i]<=temp) i++;
if(i!=j) swap(Array[j],Array[i]);
}
if(begin!=j)
swap(Array[begin],Array[j]);
QuickSort(Array,begin,j-1);
QuickSort(Array,j+1,end);
}
};

int main()
{
Solution s1;
vector<int> test1;
vector<int> result1;
test1.push_back(4);
test1.push_back(5);
test1.push_back(1);
test1.push_back(6);
test1.push_back(2);
test1.push_back(7);
test1.push_back(3);
test1.push_back(8);
//test1.push_back(4);
//s1.QuickSort(test1, 0, 8);

for(int i=0; i<test1.size(); i++)
cout<<test1[i]<<'-';
cout<<endl;

result1=s1.GetLeastNumbers_Solution(test1,4);
for(int i=0; i<result1.size(); i++)
cout<<result1[i]<<'-';
cout<<endl;
}


//桶排序,内存开销太大。基于事先知道输入数字的范围。

//快速排序和插入排序相结合。

//测试用例:[]。 输出应为空[];

//测试用例:[4,2,6,3],7。 输出应为空[]

方法二:

//方法二:有快速排序法的思想启发而来,只要最小的K个数,而不需要对这K个数排序。
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> KNum;
int InputNum=input.size();
if(InputNum==0 || k==0 || k>InputNum) return KNum;
//改进快速排序方法
QuickSort1(input,0,InputNum-1,k);
KNum.assign(input.begin(),input.begin()+k);
//对选定的数进行快速排序
QuickSort(KNum,0,k-1);
return KNum;

}
void QuickSort1(vector<int> &Array, int begin, int end, int k)
{
if(begin>=end) return;
int temp=Array[begin];
int i=begin,j=end;
while(i<j)
{
while(i<j && Array[j]>temp) j--;
while(i<j && Array[i]<=temp) i++;
if(i!=j) swap(Array[j],Array[i]);
}
if(begin!=j)
swap(Array[begin],Array[j]);
if(j==k-1 || j==k) return;
if( k<j )
QuickSort1(Array,begin,j-1,k);
if( k>j)
QuickSort1(Array,j+1,end,k);
}
void QuickSort(vector<int> &Array, int begin, int end)
{
if(begin>=end) return;
int temp=Array[begin];
int i=begin,j=end;
while(i<j)
{
while(i<j && Array[j]>temp) j--;
while(i<j && Array[i]<=temp) i++;
if(i!=j) swap(Array[j],Array[i]);
}
if(begin!=j)
swap(Array[begin],Array[j]);
QuickSort(Array,begin,j-1);
QuickSort(Array,j+1,end);
}
};


牛客网通过代码图片:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数组 快速排序