考研数据结构——C语言实现大顶堆

堆排序是一种高效的比较类算法,它利用了二叉堆数据结构。下面是代码的详细解释:

  1. #include <stdio.h>#include <stdlib.h> 是预处理指令,用于引入标准输入输出库和标准库,这样我们就可以调用 printf 和其他标准函数。

  2. int arr[] 定义了一个整型数组,其中包含了需要排序的元素。

  3. int n = sizeof(arr) / sizeof(arr[0]); 计算数组 arr 的长度。

  4. void adjustHeap(int i, int lef) 函数用于调整堆,以维护大顶堆的性质。它接受两个参数:i 是当前需要调整的节点的索引,lef 是堆中元素的总数。

    • int temp = arr[i]; 保存当前节点的值,以便在调整过程中进行比较和交换。
    • for (int k = i * 2 + 1; k < lef; k = k * 2 + 1) 循环遍历当前节点的子节点。
    • if (k + 1 < lef && arr[k] < arr[k + 1]) 检查是否存在右子节点,并且右子节点的值是否小于左子节点的值。如果是,那么 k 指向右子节点。
    • if (arr[k] > temp) 如果子节点的值大于父节点的值,交换它们,并继续向下调整。
    • else { break; } 如果子节点的值不大于父节点的值,调整结束。
  5. void swap(int a, int b) 函数用于交换数组中的两个元素。

  6. void heapsort() 函数实现了堆排序算法。

    • for (int i = n / 2 - 1; i >= 0; i--) 从最后一个非叶子节点开始,向前遍历,构建大顶堆。
    • for (int j = n - 1; j > 0; j--) 从最后一个元素开始,向前遍历,进行排序。
      • swap(0, j); 将堆顶元素(最大值)与数组末尾元素交换。
      • adjustHeap(0, j); 调整堆,确保交换后的数组仍然满足大顶堆的性质。
  7. int main() 是程序的入口点。

    • heapsort(); 调用堆排序函数。
    • for (i = 0; i < n; i++) 遍历排序后的数组,并打印每个元素。
    • printf(" "); 在每个元素后面打印一个空格,以便在输出中分隔元素。

这段代码的输出将是数组 arr 中的元素按升序排列的结果。例如,如果 arr 的初始值是 {12, 4, 132, 55, 46, 232, 789, 1, 0, 98, 523, 666},那么输出将是 {0 1 4 12 46 55 98 132 523 666 789}

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

int arr[] = { 12,4,132,55,46,232,789,1,0,98,523,666 };
int n = sizeof(arr) / sizeof(arr[0]);
void adjustHeap(int i, int lef) {
	int temp = arr[i];
	for (int k = i * 2 + 1; k < lef; k = k * 2 + 1) {
		if (k + 1 < lef && arr[k] < arr[k + 1]) {
			k++;
		}
		if (arr[k] > temp) {
			arr[i] = arr[k];
			i = k;
		}
		else {
			break;
		}
	}
	arr[i] = temp;
}

void swap(int a, int b) {
	int temp = arr[a];
	arr[a] = arr[b];
	arr[b] = temp;
}

void heapsort() {
	//构建大顶堆
	for (int i = n / 2 - 1; i >= 0; i--) {
		adjustHeap(i, n);
	}
	//调整堆结构+交换堆顶元素与末尾元素
	for (int j = n - 1; j > 0; j--) {
		swap(0, j);
		adjustHeap(0, j);
	}
}

int main() {
	int i;
	heapsort();
	for (i = 0; i < n; i++) {
		printf("%d", arr[i]);
		printf(" ");
	}
	return 0;
}
相关推荐
神仙别闹16 分钟前
基于C语言 HTTP 服务器客户端的实验
服务器·c语言·http
im_AMBER34 分钟前
Leetcode 47
数据结构·c++·笔记·学习·算法·leetcode
GilgameshJSS1 小时前
STM32H743-ARM例程40-U_DISK_IAP
c语言·arm开发·stm32·单片机·嵌入式硬件
No0d1es2 小时前
电子学会青少年软件编程(C/C++)1级等级考试真题试卷(2025年9月)
java·c语言·c++·青少年编程·电子学会·真题·一级
_OP_CHEN2 小时前
C++进阶:(七)红黑树深度解析与 C++ 实现
开发语言·数据结构·c++·stl·红黑树·红黑树的旋转·红黑树的平衡调整
不穿格子的程序员3 小时前
从零开始写算法-栈-最小值(记忆化pair)
数据结构·
小龙报3 小时前
《算法通关指南数据结构和算法篇(4)--- 队列和queue》
c语言·开发语言·数据结构·c++·创业创新·学习方法·visual studio
AI科技星3 小时前
宇宙的几何诗篇:当空间本身成为运动的主角
数据结构·人工智能·经验分享·算法·计算机视觉
前端小L3 小时前
二分查找专题(二):lower_bound 的首秀——精解「搜索插入位置」
数据结构·算法
CAU界编程小白5 小时前
数据结构系列之十大排序算法
数据结构·c++·算法·排序算法