)输出前k大的数(分治法/局部快速排序):给定一个数组,统计前k大的数并且把这k个数从大到小输出。
[输入]
第一行包含一个整数n,表示数组的大小。
第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。第三行包含一个整数k。k < n。
[输出]
从大到小输出前k大的数,每个数一行。
[样例输入]
10
4 5 6 9 8 7 1 2 3 0
5
[样例输出]
9
8
7
6
5
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
int a[1000];
void quick_sort(int a[], int start, int end)
{
if (start<end)
{
int s = a[start];
int i = start;
int j = end;
//刚开始排序从右向左查找才可以
while (i<j)
{
//从右向左查找第一个小于s的值与a[0]交换
while (i<j&&a[j] >= s)
j--;
if (i<j)
a[i++] = a[j];//把a[j]的值给a[i],并让i向后走一位
//从左向右查找第一个大于等于s的值与a[0]交换
while (i<j&&a[i]<s)
i++;
if (i<j)
{
a[j--] = a[i];//把a[i]的值给此时s所在的地址,并让j向前退一位
}
}
a[i] = s;//因为在之前的交换值过程中a[i]的值已经不是最初的值,所以要变回来
quick_sort(a, start, i - 1);//排序枢轴前数列
quick_sort(a, i + 1, end);//排序枢轴后数列
}
}
int main()
{
int n;//输入n个数字
scanf("%d", &n);
int i = 0;//用于存储数字时的循环计数
for (i = 0; i<n; i++) //将n个数字存入数组中
scanf("%d", &a[i]);
int k;
scanf("%d", &k);
quick_sort(a, 0, n - 1);//快速排序函数调用
for (i = n - 1; k>0; k--, i--) //循环输出排序结果
printf("%d\n", a[i]);
system("pause");
return 0;
}