题目链接
描述
给定一个数组,统计前k大的数并且把这k个数从大到小输出。
输入
第一行包含一个整数n,表示数组的大小。n < 100000。
第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。
第三行包含一个整数k。k < n。
输出
从大到小输出前k大的数,每个数一行。
样例输入
10
4 5 6 9 8 7 1 2 3 0
5
样例输出
9
8
7
6
5
AC代码:
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
int n,x,arr[100005];
bool cmp(int a,int b){
return a > b;
}
void Divide(int arr[],int l,int r){
int i,j,k;
if(l >= r)
return;
i = l,j = r,k = arr[i];
while(i < j){
while(i < j && arr[j] <= k)
j--;
swap(arr[i],arr[j]);
while(i < j && arr[i] >= k)
i++;
swap(arr[i],arr[j]);
}
if(i == x)
return;
else if(i > x)//按照从大到小排列
Divide(arr,l,i - 1);//如果我划分的前i个大的数的个数 > 我所要寻找的个数,那么我就在后半部分寻找
else
Divide(arr,i + 1,r);//如果我划分的前i个大的数的个数 < 我所要寻找的个数,那么我就在前半部分寻找
return;
}
int main(){
scanf("%d",&n);
for(int i = 0;i < n;i++)
scanf("%d",&arr[i]);
scanf("%d",&x);
Divide(arr,0,n - 1);
sort(arr,arr + x,cmp);
for(int i = 0;i < x;i++)
printf("%d\n",arr[i]);
return 0;
}
错误代码:
[]里的是两段代码不同之处
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
int n,x,arr[100005];
bool cmp(int a,int b){
return a > b;
}
void Divide(int arr[],int l,int r,int m){
int i,j,k;
if(l >= r)
return;
i = l,j = r,k = arr[i];
while(i < j){
while(i < j && arr[j] <= k)
j--;
swap(arr[i],arr[j]);
while(i < j && arr[i] >= k)
i++;
swap(arr[i],arr[j]);
}
if(i == m)
return;
else if(i > m)
[Divide(arr,l,i - 1,m);]
else
[Divide(arr,i,r,m - i);]
return;
}
int main(){
scanf("%d",&n);
for(int i = 0;i < n;i++)
scanf("%d",&arr[i]);
scanf("%d",&x);
Divide(arr,0,n - 1,x);
sort(arr,arr + x,cmp);
for(int i = 0;i < x;i++)
printf("%d\n",arr[i]);
return 0;
}