preface: 《算法导论》是计算机科学丛书中占据举足轻重地位的重要参考书。 我将使用cpp等代码语言来实现其中的重要伪代码,附带详细注释
第6章 堆排序
代码实现
堆排序
int left(int i) { return 2 * i; } // 左子节点标号
int right(int i) { return 2 * i + 1; } // 右子节点标号
void maxHeapify(int A[], int i, int heapSize) // 将标号i的元素交换进入合适位置
{
int l = left(i);
int r = right(i);
int largest = 0;
if (l <= heapSize && A[l - 1] > A[i - 1])
{
largest = l;
}
else
{
largest = i;
}
if (r <= heapSize && A[r - 1] > A[largest - 1])
{
largest = r;
}
if (largest != i)
{
int tmp = A[largest - 1];
A[largest - 1] = A[i - 1];
A[i - 1] = tmp;
maxHeapify(A, largest, heapSize);
}
}
void buildMaxHeap(int A[], int len) // 建立大根堆
{
for (int i = len / 2; i >= 1; i--)
{
maxHeapify(A, i, len);
}
}
void heapSort(int A[], int len) // 堆排序,本质是不断取大根堆的根,然后再建立大根堆的循环过程。时间复杂度优于插入排序,空间复杂度优于归并排序
{
buildMaxHeap(A, len);
for (int i = len; i >= 2; i--)
{
int tmp = A[i - 1];
A[i - 1] = A[0];
A[0] = tmp;
len -= 1;
maxHeapify(A, 1, len);
}
}