《算法导论》中你必须理解的伪代码——1

178 阅读1分钟

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);
    }
}