)輸出前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;
}