什么是堆排序
堆排序是一种基于堆数据结构的排序算法。堆是一种完全二叉树,可以分为最大堆和最小堆。最大堆的父节点始终大于等于左右子节点,最小堆的父节点始终小于等于左右子节点。在堆排序中,首先将待排序的数组构建成一个最大堆或最小堆,然后依次将堆顶元素与最后一个元素交换,然后重新调整堆,使得剩余元素重新满足堆的特性。这个过程会像“下沉”一样,有时又被称为“堆化”,直到所有元素排好序为止。时间复杂度为O(nlogn)。
下面是用C语言实现堆排序的代码
#include <stdio.h>
#include <stdlib.h>
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
// 调整堆
void heap_adjust(int arr[], int i, int n)
{
int j, tmp;
tmp = arr[i];
j = 2 * i + 1;
while (j < n) {
if (j + 1 < n && arr[j + 1] > arr[j]) {
j++;
}
if (arr[j] <= tmp) {
break;
}
arr[i] = arr[j];
i = j;
j = 2 * i + 1;
}
arr[i] = tmp;
}
// 堆排序函数
void heap_sort(int arr[], int len)
{
int i;
// 构造初始堆
for (i = len / 2 - 1; i >