堆排序:
一种实现堆排序的方法为:使用标准库中的优先级队列:
首先要包含头文件#include
它和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。
定义:priority_queue
例:
priority_queue
priority_queue
而最基础的是堆排序最初的定义:
步骤如下:
给出数组:6,8,7,9,0,1,3,2,4,5 进行堆排序
一、
首先将其看做一颗完全二叉树:
二、
调整至初始大根堆,此时堆顶数最大
三、
将堆顶放至数组末尾,剩余的数继续调整为大根堆
四、
全部调整完毕,输出结果
调整过程:
由根节点开始,依次向下调整,保证根节点为最大值
/*--------调整堆---------*/
void shift(vector<int>& v, int i, int len) {//调整堆
int left = i * 2 + 1;
int right = i * 2 + 2;
int max_index = i;
if (left<len&&v[left]>v[max_index])
max_index = left;
if (right<len&&v[right]>v[max_index])
max_index = right;
if (max_index != i) {
swap(v[i], v[max_index]);
shift(v, max_index, len);
}
}
/*--------循环建立大根堆---------*/
void build(vector<int>& v, int len) {//最初建堆
int start = len / 2 + 1;
for (; start >= 0; --start) {//从最后一个非叶子节点向上,直到第一节点
shift(v, start, len);
}
}
void heap_sort(vector<int>& v) {//堆排序
int len = v.size();
build(v, len);
for (int i = len - 1; i >= 1; --i) {
swap(v[0], v[i]);
shift(v, 0, i);
}
}
//测试:
int main(){
vector<int> arr = { 3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6 };
heap_sort(arr);
for (int i = 0; i < arr.size(); i++)
cout << arr[i] << ' ';
cout << endl;
return 0;
}