题目具体要求:用快速选择算法求第k个大的数。
分析:快速选择算法是一种基于快速排序的选择算法,它与快速排序的主要区别在于,快速选择只需要找到第k个最大的元素,而不需要对整个数组进行完全排序。因此,我们可以在快速排序的基础上进行优化,以减少不必要的排序操作。
C语言代码实现如下:
#include<stdio.h>
#define N 10010
int q[N];
int quick_sort(int q[], int l, int r, int k) {
//递归结束条件
if (l >= r) return q[l];//返回第k 个数
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j) {
do i++; while (x < q[i]);
do j--; while (x > q[j]);
if (i > j) {
int temp = q[i];
q[i] = q[j];
q[j] = temp;
}
}
int numl = j - l + 1;//左半边元素个数
if(k <= numl) return quick_sort(q, l, j, k);
return quick_sort(q, j + 1, r, k - numl);
}
int main() {
int n, k, result;
scanf("%d %d", &n, &k);
for (int i = 0; i < n; i++)
scanf("%d", &q[i]);
result = quick_sort(q, 0, n - 1, k);
printf("%d\n", result);
return 0;
}