您的位置:首页 > 其它

堆排序(算法导论实现)

2015-07-22 20:57 561 查看
#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调整堆的跟(不包括先前拿出的堆首)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  堆排序