#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了!!
太美妙了!!