20170927_快排应用_数组中寻找最大的K个数
2017-09-27 18:50
281 查看
20170927_快排应用_数组中寻找最大的K个数
在数组中寻找最大的 K 个数:
例如,输入:4,5,1,6,2,7,3,8 这8个数字,
输出最大的4个数是:5,6,7,8
/*在数组中寻找最大的k个数
例如,输入:4,5,1,6,2,7,3,8 这8个数字,
输出最大的4个数是:5,6,7,8
*/
#include<iostream>
#include<vector>
#include<algorithm>
#include<numeric>
using namespace std;
class Solution
{
public:
void GetMaxKthNumbers(vector<int> &input, vector<int> &res, int k)
{
int n=input.size();
if(k>n || n<=0 || k<=0)
{
cout<<-1<<endl;
return;
}
int start=0;
int end=n-1;
int index=partion(input,start,end); //返回的是第(index+1)小元素值
while(index!=(n-k))
{
if(index>(n-k))
{
end=index-1;
index=partion(input,start,end);
}
else
{
start=index+1;
index=partion(input,start,end);
}
}
//cout<<input[index]<<endl;
for(int i=index,j=0; i<n; ++i)
{
res[j++]=input[i];
}
}
public:
//快速排序的一次划分函数
int partion(vector<int> &input, int start, int end)
{
int n=input.size();
if(n<1)
return -1;
int i=start;
int j=end;
while(i<j)
{
while(i<j && input[i]<=input[j])
--j;
if(i<j)
{
swap(input[i],input[j]);
++i;
}
while(i<j && input[i]<=input[j])
++i;
if(i<j)
{
swap(input[i],input[j]);
--j;
}
}
return i; //返回的是第(i+1)小元素值
}
};
int main(void)
{
//int input[]={4,5,1,6,2,7,3,8};
int ch=0;
vector<int> input;
while(cin>>ch)
input.push_back(ch);
int n=input.size();
cin.clear(); //换行,清除输入缓冲!!!
int k=0;
cin>>k;
vector<int> res(k);
class Solution object;
object.GetMaxKthNumbers(input,res,k);
for(auto mem:res)
cout<<mem<<",";
cout<<endl;
system("pause");
return 0;
}
在数组中寻找最大的 K 个数:
例如,输入:4,5,1,6,2,7,3,8 这8个数字,
输出最大的4个数是:5,6,7,8
/*在数组中寻找最大的k个数
例如,输入:4,5,1,6,2,7,3,8 这8个数字,
输出最大的4个数是:5,6,7,8
*/
#include<iostream>
#include<vector>
#include<algorithm>
#include<numeric>
using namespace std;
class Solution
{
public:
void GetMaxKthNumbers(vector<int> &input, vector<int> &res, int k)
{
int n=input.size();
if(k>n || n<=0 || k<=0)
{
cout<<-1<<endl;
return;
}
int start=0;
int end=n-1;
int index=partion(input,start,end); //返回的是第(index+1)小元素值
while(index!=(n-k))
{
if(index>(n-k))
{
end=index-1;
index=partion(input,start,end);
}
else
{
start=index+1;
index=partion(input,start,end);
}
}
//cout<<input[index]<<endl;
for(int i=index,j=0; i<n; ++i)
{
res[j++]=input[i];
}
}
public:
//快速排序的一次划分函数
int partion(vector<int> &input, int start, int end)
{
int n=input.size();
if(n<1)
return -1;
int i=start;
int j=end;
while(i<j)
{
while(i<j && input[i]<=input[j])
--j;
if(i<j)
{
swap(input[i],input[j]);
++i;
}
while(i<j && input[i]<=input[j])
++i;
if(i<j)
{
swap(input[i],input[j]);
--j;
}
}
return i; //返回的是第(i+1)小元素值
}
};
int main(void)
{
//int input[]={4,5,1,6,2,7,3,8};
int ch=0;
vector<int> input;
while(cin>>ch)
input.push_back(ch);
int n=input.size();
cin.clear(); //换行,清除输入缓冲!!!
int k=0;
cin>>k;
vector<int> res(k);
class Solution object;
object.GetMaxKthNumbers(input,res,k);
for(auto mem:res)
cout<<mem<<",";
cout<<endl;
system("pause");
return 0;
}
相关文章推荐
- 20170927_快排应用_数组中寻找第K大的数字
- 20170927_快排应用_数组中寻找最小的K个数
- 每日一题(22) - 寻找数组中的最大值和最小值
- 【C代码练习23】用指针寻找数组中的最大值和最小值
- 编程之美2.10 寻找数组中的最大值和最小值
- 蓝桥杯——寻找数组中的最大值
- 蓝桥杯 算法训练 寻找数组中最大值
- 编程之美_009寻找数组中的最大值和最小值
- 寻找数组中的最大值和最小值
- 求数组最大k个数的问题(堆的应用)
- 算法训练 寻找数组中最大值
- 寻找数组中的最大值和最小值
- C语言 · 寻找数组中的最大值
- 寻找数组中的最大值和最小值(编程之美2.10)
- (1.5.2.9)寻找数组的最大值和最小值
- 蓝桥杯--算法训练之ALGO-49 寻找数组中最大值
- 前缀和的应用(求最大连续子数组的和)
- 蓝桥杯算法训练 寻找数组中最大值
- 寻找数组中最大值
- 用堆排序寻找数组中最大的K个数