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语言输出完全指南:掌握Printf、Puts、Putchar与格式化技巧
https://www.shuihudhg.cn/134451.html
Python 安全执行用户代码:从`exec`/`eval`到容器化沙箱的全面指南
https://www.shuihudhg.cn/134450.html
Python源代码加密的迷思与现实:深度解析IP保护策略与最佳实践
https://www.shuihudhg.cn/134449.html
深入理解PHP数组赋值:值传递、引用共享与高效实践
https://www.shuihudhg.cn/134448.html
Java数据成员深度解析:定义、分类、初始化与最佳实践
https://www.shuihudhg.cn/134447.html
热门文章
C 语言中实现正序输出
https://www.shuihudhg.cn/2788.html
c语言选择排序算法详解
https://www.shuihudhg.cn/45804.html
C 语言函数:定义与声明
https://www.shuihudhg.cn/5703.html
C语言中的开方函数:sqrt()
https://www.shuihudhg.cn/347.html
C 语言中字符串输出的全面指南
https://www.shuihudhg.cn/4366.html