#算法#排序~堆排序

32 篇文章 0 订阅
3 篇文章 0 订阅
#include <iostream>
#include <vector>
using namespace std;
/*
class MaxHeap {
private:
    vector<int> heap;
    int max_size = 0;
    void swap(vector<int>& arr, int a, int b) {
        int tmp = arr[a];
        arr[a] = arr[b];
        arr[b] = tmp;
    }
public:
    MaxHeap() {
        this->heap = new vector<int>(max_size, -1);
        max_size = 100;
    }

    //上浮过程:一般用于堆尾端插入元素后,重新调整堆
    void upAdjust(vector<int>& arr) {
        int size = arr.size();
        //最后一个元素即为新插入元素
        int child = size - 1;
        int parent = (child - 1) / 2;
        // //将最后一个元素存入temp 最后归位,减少交换计算
        // int temp = arr[child];
        //从下往上循环上浮:判定条件child > 0 保证孩子最大为根节点的子节点
        while (child > 0 && arr[child] > arr[parent]) {
            swap(arr, child, parent);
            //上浮过程
            child = parent;
            parent = (child - 1) / 2;
        }
    }
    //下沉过程:一般用于堆的建造,以及删除元素后堆的重新排列
    void downAdjust(vector<int>& arr, int parent, int size) {
        int child = parent * 2 + 1;
        //从当前节点往下下沉过程
        while (child < size) {
            //若右孩子也存在,则查找左右孩子最大的值
            if (child + 1 < size) {
                child = arr[child + 1] > arr[child] ? child + 1 : child;
            }
            //若父节点大于孩子中最大值则下沉结束
            if (arr[parent] >= arr[child]) return;

            //否则,将父节点与较大孩子交换
            swap(arr, parent, child);

            //迭代子树
            parent = child;
            child = 2 * parent + 1;
        }
    }

    //构建大顶堆,从最后一个非叶子节点开始downAdjust
    void buildHeap(vector<int>& arr) {
        int size = arr.size();
        for (int i = size / 2 - 1; i >= 0; i--) {
            downAdjust(arr, i, size);
        }
    }


    void headSort(vector<int>& arr) {
        //将最大元素放在最后以为,调整堆
        for (int i = arr.size() - 1; i >= 0; i--) {
            swap(arr, 0, i);
            downAdjust(arr, 0, i);
        }

    }

};
*/

void swap(vector<int>& arr, int a, int b) {
    int tmp = arr[a];
    arr[a] = arr[b];
    arr[b] = tmp;
}
//上浮过程:一般用于堆尾端插入元素后,重新调整堆
void upAdjust(vector<int>& arr) {
    int size = arr.size();
    //最后一个元素即为新插入元素
    int child = size - 1;
    int parent = (child - 1) / 2;
    // //将最后一个元素存入temp 最后归位,减少交换计算
    // int temp = arr[child];
    //从下往上循环上浮:判定条件child > 0 保证孩子最大为根节点的子节点
    while (child > 0 && arr[child] > arr[parent]) {
        swap(arr, child, parent);
        //上浮过程
        child = parent;
        parent = (child - 1) / 2;
    }
}
//下沉过程:一般用于堆的建造,以及删除元素后堆的重新排列
void downAdjust(vector<int>& arr, int parent, int size) {
    int child = parent * 2 + 1;
    //从当前节点往下下沉过程
    while (child < size) {
        //若右孩子也存在,则查找左右孩子最大的值
        if (child + 1 < size) {
            child = arr[child + 1] > arr[child] ? child + 1 : child;
        }
        //若父节点大于孩子中最大值则下沉结束
        if (arr[parent] >= arr[child]) return;

        //否则,将父节点与较大孩子交换
        swap(arr, parent, child);

        //迭代子树
        parent = child;
        child = 2 * parent + 1;
    }
}

//构建大顶堆,从最后一个非叶子节点开始downAdjust
void buildHeap(vector<int>& arr) {
    int size = arr.size();
    for (int i = size / 2 - 1; i >= 0; i--) {
        downAdjust(arr, i, size);
    }
}


void headSort(vector<int>& arr) {
    //将最大元素放在最后以为,调整堆
    for (int i = arr.size() - 1; i >= 0; i--) {
        swap(arr, 0, i);
        downAdjust(arr, 0, i);
    }

}


void show(vector<int> arr) {
    for (auto elem : arr) {
        cout << elem << "  ";
    }
    cout << endl;
}
int main(void) {

    vector<int> heap = { 8, 1, 14, 3, 21, 5, 7, 10 };
    show(heap);
    
    
    buildHeap(heap);
    show(heap);
    headSort(heap);
    show(heap);


    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值