输入n,k及n个不超过10000的正整数,按从大到小输出前k个数C语言
时间: 2024-10-12 08:17:46 浏览: 36
对于给定的由n 个自然数组成的多重集S,编程计算S 的众数及其重数。
4星 · 用户满意度95%
在C语言中,你可以通过优先队列(堆数据结构)来解决这个问题。这里是一个简单的解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
// 创建一个最大堆结构
void max_heapify(int arr[], int n, int i) {
int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < n && arr[left] > arr[largest])
largest = left;
if (right < n && arr[right] > arr[largest])
largest = right;
if (largest != i) {
swap(&arr[i], &arr[largest]);
max_heapify(arr, n, largest);
}
}
// 交换两个元素
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 主函数,输入数组并输出前k个最大值
void printTopKNumbers(int arr[], int n, int k) {
// 使用最大堆存储前k个最大值
for (int i = n / 2 - 1; i >= 0; i--)
max_heapify(arr, n, i);
// 输出前k个最大值
printf("前 %d 个数: ", k);
for (int i = 0; i < k; ++i) {
printf("%d ", arr[0]);
max_heapify(arr, n, 0); // 移除最大值后调整堆
}
printf("\n");
}
int main() {
int n, k;
printf("请输入n和k: ");
scanf("%d %d", &n, &k);
// 读取n个整数
int numbers[n];
for (int i = 0; i < n; ++i)
scanf("%d", &numbers[i]);
printTopKNumbers(numbers, n, k);
return 0;
}
```
当你运行这个程序时,它会首先构建一个最大堆,然后不断地取出堆顶的最大元素并调整堆,直到找到前k个最大的数。请注意,此代码假设用户提供的k不会超过可用的元素数量。
阅读全文