优先队列和基于优先队列的堆排序(学习笔记)

#include <iostream>
#include <vector>
using namespace std;
class MaxPQ {//一个优先队列罢了!
private:
    vector<int> pq;
    int N;
    void sink(int k);
    void sink(vector<int>& nums, int k, int N);//为heapsort重构的sink,注意要传入N。
    void swim(int k);
    void swim(vector<int>& nums, int k);
    bool less(int i, int j) { return pq[i] <= pq[j]; };
    bool less(vector<int>& nums, int i, int j) { return nums[i] <= nums[j]; };
    void exch(int i, int j);
    void exch(vector<int>& nums, int i, int j);

public:
    MaxPQ();
    ~MaxPQ();
    MaxPQ(vector<int>& nums);
    void show();
    void show(int N);
    void insert(int v);
    int max() { return pq[1]; };
    int delmax();
    bool is_empty() { return (N == 0); };
    void HeapSort(vector<int>& nums);
};

void MaxPQ::exch(int i, int j) {
    int temp = pq[i];
    pq[i] = pq[j];
    pq[j] = temp;
}

MaxPQ::MaxPQ() {
    pq.push_back(19);//pq数组的首个元素不使用。
    N = 0;
}

MaxPQ::~MaxPQ() {
    //啥也不用干!
}

void MaxPQ::show(int N) {
    for (int i = 1; i <= N; i++) {
        cout << pq[i] << ' ';
    }
}

void MaxPQ::show() {
    for (int i = 0; i <= N; i++){
        cout << pq[i] << ' ';
    }
}

MaxPQ::MaxPQ(vector<int>& nums) {
    pq.push_back(NULL);
    N = 0;
    for (int i : nums) {
        pq.push_back(i);
        swim(++N);
    }
}

void MaxPQ::swim(int k) {
    while (k > 1 && less(k / 2, k)) {
        exch(k, k / 2);
        k /= 2;
    }
}

void MaxPQ::sink(int k) {
    while (k * 2 <= N) {
        int i = k * 2;
        if (i + 1 <= N && less(i, i + 1))i++;
        if (!(less(k, i)))break;
        exch(k, i);
        k = i;
    }
}

void exch(vector<int>& nums, int i, int j) {
    int temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
}

void MaxPQ::sink(vector<int>& nums, int k, int N) {
    while (k * 2 <= N) {
        int i = k * 2;
        if (i + 1 <= N && less(nums,i, i + 1))i++;
        if (!(less(nums, k, i)))break;
        exch(nums, k, i);
        k = i;
    }
}

int MaxPQ::delmax() {
    int max = pq[1];
    exch(1, N--);
    sink(1);
    return max;
}

void MaxPQ::insert(int v) {
    pq.push_back(v);
    swim(++N);
}

void MaxPQ::HeapSort(vector<int>& nums) {//基于优先队列的堆排列(虽然很傻,但我觉得集成进来很好玩啊)
    int N = nums.size();
    nums.insert(nums.begin(), 0);//头插一个0方便操作 也可以不头插,但是好麻烦啊
    for (int i = N / 2; i >= 1; i--) {//从倒数第二层开始往上遍历,调用sink()函数
        sink(nums, i, N);
    }
    while (N > 0) {
        exch(nums,1, N--);
        sink(nums,1,N);
    }
}

void MaxPQ::exch(vector<int>& nums, int i, int j) {
    int temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
}

void show(vector<int>& nums) {
    for (int i : nums) {
        cout << i << ' ';
    }
}


vector<int>test_array = { 3, 3, 1, 4, 6, 4, 9, 39 };
int main() {
    MaxPQ m_MaxPQ;
    m_MaxPQ.HeapSort(test_array);
    show(test_array);
}

总结

《算法》真是好书阿!!

一边学习一边跟着敲代码,本书的代码写得实在是太cooooooool了!!

太美妙了!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值