堆排序(算法导论实现)
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调整堆的跟(不包括先前拿出的堆首)。