#include <iostream>
#include <vector>
using namespace std;
int heap_size;
int left(int i){
return 2 * i + 1;
}
int right(int i){
return 2 * i + 2;
}
void exchange(vector<int>& v, int k, int largest){
int temp = v[k];
v[k] = v[largest];
v[largest] = temp;
}
void max_heapify(vector<int>& v, int k){
int l = left(k), r = right(k);
int largest;
if(l <= heap_size - 1 && v[l] > v[k])
largest = l;
else
largest = k;
if(r <= heap_size - 1 && v[r] > v[largest])
largest = r;
if(largest != k){
exchange(v, k, largest);
max_heapify(v, largest);
}
}
void build_max_heap(vector<int>& v){
for(int i = heap_size/2 - 1; i >= 0; i--){
max_heapify(v, i);
}
}
void heap_sort(vector<int>& v){
build_max_heap(v);
for(int i = v.size() - 1; i > 0; i--){
exchange(v, 0, i);
heap_size -= 1;
max_heapify(v, 0);
}
}
int main(){
/* 3, 5, 6 ,8, 2, 1, 9, 4, 0, 7 */
vector<int> v;
v.push_back(3);v.push_back(5);v.push_back(6);v.push_back(8);v.push_back(2);
v.push_back(1);v.push_back(9);v.push_back(4);v.push_back(0);v.push_back(7);
heap_size = v.size();
heap_sort(v);
for(int i = 0; i < 10; i++){
cout << v[i] << " ";
}
system("PAUSE");
}
核心函数:
max_heapify :假定i的子树已经是最大堆,而i不满足最大堆,该函数调整i及其子树,使得i满足最大堆(注意,i的子树必须已经是最大堆)
build_max_heap: 自底向上构建最大堆,注意,因为max_heapify要求子树是最大堆,build_max_heap必须自底向上建堆
heap_sort:先建堆,再把堆首部(数组下标是0)拿出来跟堆尾交换,此时队尾是堆的根,它不满足最大堆性质(但是其子树全部满足最大堆),只需调用max_heapify调整堆的跟(不包括先前拿出的堆首)。