一、算法介绍
堆排序是一种基于二叉堆数据结构的排序算法。首先,构建最大堆(或最小堆),将待排序的数组视作一个完全二叉树,通过从最后一个非叶子节点开始向上调整,使得每个父节点的值都大于等于(最大堆)或小于等于(最小堆)其子节点的值。这步骤确保了最大(或最小)值位于堆的根节点。
然后,将堆顶元素(最大值或最小值)与数组的最后一个元素交换位置,并将堆的大小减一。接着,对新的堆顶进行堆调整,使得剩余元素重新满足堆的性质。重复以上步骤,直到堆的大小减至1,即完成排序。
堆排序的时间复杂度为O(n log n),其中n是待排序数组的长度。它具有原地排序的特点,不需要额外的辅助空间,且相对于快速排序等算法,堆排序在最坏情况下也能保持较好的性能。然而,与归并排序相比,堆排序对于稳定性的保持较差,因为在堆调整的过程中可能破坏相同元素之间的相对顺序。
二、代码示例
void swap(int *a, int *b) {int temp = *b;*b = *a;*a = temp;
}void max_heapify(int index[], int start, int end) {int dad = start;int son = dad * 2 + 1;while (son <= end) {if (son + 1 <= end && index[son] < index[son + 1])son++;if (index[dad] > index[son])return;else {swap(&index[dad], &index[son]);dad = son;son = dad * 2 + 1;}}
}void heap_sort(int index[], int len) {int i;for (i = len / 2 - 1; i >= 0; i--)max_heapify(index, i, len - 1);for (i = len - 1; i > 0; i--) {swap(&index[0], &index[i]);max_heapify(index, 0, i - 1);}
}