自我学习 - C++堆排序

堆排序:

#include <iostream>

using namespace std;

// 建大根堆
void Heap_build(int a[], int root, int len) {
    int lchild = root*2 + 1;
    if (lchild < len) {
        int flag = lchild;
        int rchild = lchild + 1;
        if (rchild < len) {
            if (a[rchild] > a[lchild]) {
                flag = rchild;
            }
        }

        if (a[root] < a[flag]) {

            // 交换根节点和最大的子节点
            swap(a[root], a[flag]);

            // 从最大的子节点开始继续递归建堆
            Heap_build(a, flag, len);
        }
    }
}

// 堆排序
void Heap_sort(int a[], int len) {
    // 建大根堆
    for (int i = len / 2; i >= 0; --i) {
        Heap_build(a, i, len);
    }

    // 把每次大根堆的最大值放到相应位置(从小到大)
    for (int j = len - 1; j > 0 ; --j) {
        swap(a[0], a[j]);

        // 交换后破坏了大根堆,需要再次建大根堆
        Heap_build(a, 0, j);
    }
}

int main(){
    int a[10] = {12,45,748,12,56,3,89,4,48,2};
    Heap_sort(a, 10);
    for (int i = 0; i < 10; ++i) {
        cout << a[i] << " ";
    }
    cout << endl;
    return 0;
}

  

posted @ 2021-03-17 22:44  adamweng  阅读(53)  评论(0)    收藏  举报