堆排序是一种高效的比较类算法,它利用了二叉堆数据结构。下面是代码的详细解释:
-
#include <stdio.h>
和#include <stdlib.h>
是预处理指令,用于引入标准输入输出库和标准库,这样我们就可以调用printf
和其他标准函数。 -
int arr[]
定义了一个整型数组,其中包含了需要排序的元素。 -
int n = sizeof(arr) / sizeof(arr[0]);
计算数组arr
的长度。 -
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; }
如果子节点的值不大于父节点的值,调整结束。
-
void swap(int a, int b)
函数用于交换数组中的两个元素。 -
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);
调整堆,确保交换后的数组仍然满足大顶堆的性质。
-
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;
}