C 语言找出数组中前 m 大的数89


在 C 语言中,我们需要处理各种问题,其中一个常见问题是找出数组中的前 m 个最大值。此问题在许多应用中很有用,例如统计分析、数据挖掘和排序算法。以下是一些找出数组中前 m 大数的步骤:

步骤 1:构建最大堆

我们从构建最大堆开始。最大堆是一种二叉树,其中每个节点的值都大于或等于其子节点的值。我们可以使用以下函数构建最大堆:```c
void buildMaxHeap(int arr[], int size) {
for (int i = size / 2 - 1; i >= 0; i--) {
maxHeapify(arr, size, i);
}
}
```
```c
void maxHeapify(int arr[], int size, int root) {
int largest = root;
int left = 2 * root + 1;
int right = 2 * root + 2;
if (left < size && arr[left] > arr[largest]) {
largest = left;
}
if (right < size && arr[right] > arr[largest]) {
largest = right;
}
if (largest != root) {
swap(arr, root, largest);
maxHeapify(arr, size, largest);
}
}
```

步骤 2:提取 m 个最大值

一旦我们构建了最大堆,就可以提取堆顶 m 个最大值。堆顶始终是堆中最大的元素。我们可以重复以下步骤 m 次:```c
for (int i = 0; i < m; i++) {
printf("%d ", arr[0]);
swap(arr, 0, size - 1 - i);
size--;
maxHeapify(arr, size, 0);
}
```

完整代码

以下是 C 语言找出数组中前 m 大数的完整代码:```c
#include
#include
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void buildMaxHeap(int arr[], int size) {
for (int i = size / 2 - 1; i >= 0; i--) {
maxHeapify(arr, size, i);
}
}
void maxHeapify(int arr[], int size, int root) {
int largest = root;
int left = 2 * root + 1;
int right = 2 * root + 2;
if (left < size && arr[left] > arr[largest]) {
largest = left;
}
if (right < size && arr[right] > arr[largest]) {
largest = right;
}
if (largest != root) {
swap(arr, root, largest);
maxHeapify(arr, size, largest);
}
}
void printMaxM(int arr[], int size, int m) {
buildMaxHeap(arr, size);
for (int i = 0; i < m; i++) {
printf("%d ", arr[0]);
swap(arr, 0, size - 1 - i);
size--;
maxHeapify(arr, size, 0);
}
}
int main() {
int arr[] = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7};
int size = sizeof(arr) / sizeof(arr[0]);
int m = 5;
printMaxM(arr, size, m);
return 0;
}
```

2024-12-02


上一篇:C 语言中的成员函数: 对象导向编程的基础

下一篇:C 语言函数权威指南:进阶指南