码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序和优先级队列

时间:2016-01-25 06:38:03      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:


1
// max_heap and priority queue 2 // the index must be [1,size],not [0,size-1] 3 #include<iostream> 4 using namespace std; 5 int arr[20] = {1,4,2,3,9,7,8,14,10,16}; 6 #define PARENT(i) (i/2) 7 #define LEFT(i) (i*2) 8 #define RIGHT(i) (i*2+1) 9 #define ERROR (-1) 10 // dump an array 11 void dump(int arr[],int cnt) 12 { 13 for(int i=0;i<cnt;i++){ 14 cout<<arr[i]<<" "; 15 } 16 cout<<endl; 17 } 18 19 // ensure the max heap time=O(lg(n)) 20 void max_heapify(int arr[],const int size,const int index) 21 { 22 int l=LEFT(index),r=RIGHT(index),largest = index; 23 if(l<=size && arr[l-1] > arr[index-1])largest=l; 24 if(r<=size && arr[r-1] > arr[largest-1])largest=r; 25 if(largest != index) 26 { 27 int tmp = arr[largest-1]; 28 arr[largest-1] = arr[index-1]; 29 arr[index-1] = tmp; 30 max_heapify(arr,size,largest); 31 } 32 } 33 34 // build max_heap,time=O(n) 35 // if index>size/2,arr[index] must be a leaf 36 void build_max_heap(int arr[],const int size) 37 { 38 for(int i=size/2;i>0;i--) 39 { 40 max_heapify(arr,size,i); 41 } 42 } 43 44 // heap_sort,time=O(nlg(n)) 45 void heap_sort(int arr[],int size) 46 { 47 int tmp; 48 for(int i=size;i>1;i--) 49 { 50 tmp = arr[0]; 51 arr[0] = arr[i-1]; 52 arr[i-1] = tmp; 53 max_heapify(arr,--size,1); 54 } 55 } 56 57 // return max key of arr 58 int top(int arr[],const int size) 59 { 60 return arr[0]; 61 } 62 63 // return max key of arr and delete it 64 int pop(int arr[],int &size) 65 { 66 if(size < 1)return ERROR; 67 int max = arr[0]; 68 arr[0] = arr[--size]; 69 max_heapify(arr,size,1); 70 return max; 71 } 72 73 // increase the key of i 74 void heap_increase_key(int arr[],int i,int key) 75 { 76 if(key < arr[i-1])return; 77 arr[i-1] = key; 78 while(i>1 && arr[i-1]>arr[PARENT(i)-1]) 79 { 80 int tmp = arr[i-1]; 81 arr[i-1] = arr[PARENT(i)-1]; 82 arr[PARENT(i)-1] = tmp; 83 i = PARENT(i); 84 } 85 } 86 87 // insert into priority queue 88 void insert(int arr[],int &size,int key) 89 { 90 size++; 91 arr[size] = key-1; 92 heap_increase_key(arr,size,key); 93 } 94 int main() 95 { 96 int n = 10; 97 build_max_heap(arr,n); 98 dump(arr,n); 99 //heap_sort(arr,n); 100 //dump(arr,n); 101 pop(arr,n); 102 dump(arr,n); 103 insert(arr,n,13); 104 dump(arr,n); 105 return 0; 106 }

值得注意的是,堆排序中使用(i/2)表示父节点,(2*i)表示左节点,(2*i+1)表示右节点,所以这里面的 i 是从1开始计数的,而我们常见的数组是从0开始计数的,所以在调用[]取值操作时要记得下标-1

 

堆排序和优先级队列

标签:

原文地址:http://www.cnblogs.com/tangxin-blog/p/5156495.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!