排序算法_堆排序(最大堆、最小堆)
2013-08-27 21:37
148 查看
int left(int i) { return 2*i; } int right(int i) { return 2*i+1; } void exchange(int &a,int &b) { a=a+b; b=a-b; a=a-b; } //-------------------------- template<typename T> void max_heapify(T a[],int i,int size) { int l=left(i); int r = right(i); int largest = 0; if(l<=size&&a[l]>a[i]) { largest = l; } else { largest=i; } if(r<=size&&a[r]>a[largest]) { largest=r; } if(largest!=i) { exchange(a[i],a[largest]); max_heapify(a,largest,size); } } //-------------------------- template<typename T> void build_max_heap(T a[],int size) { for(int i=size/2;i>=1;--i) { max_heapify(a,i,size); } } //-------------------------- template<typename T> void heapsort(T a[],int size) { build_max_heap(a,size); for(int i =size;i>=2;--i ) { exchange(a[1],a[i]); size=size-1; max_heapify(a,1,size); } } //----------------------例如---------------------- { int data[]={0,8,5,4,6,13,7,1,9,12,11,3,10,2};//数组第一个元素不考虑 for(int i=1;i<14;i++) { printf("%d ",data[i]); } heapsort(data,13); for(int i=1;i<14;i++) { printf("%d ",data[i]); } system("PAUSE"); return 0; } //--------------------------最小堆--只需要更改这个函数---------- template<typename T> void max_heapify(T a[],int i,int size) { int l=left(i); int r = right(i); int largest = 0; if(l<=size&&a[l]<a[i]) { largest = l; } else { largest=i; } if(r<=size&&a[r]<a[largest]) { largest=r; } if(largest!=i) { exchange(a[i],a[largest]); max_heapify(a,largest,size); } } //-----------------------------------
相关文章推荐
- C++实现堆、最大堆、最小堆 -- 堆排序插入删除操作
- 最大堆、最小堆、堆排序
- 一步一步解析java排序算法---堆排序(最大堆)
- 堆排序 最大堆 最小堆 Java实现
- 排序算法之堆排序详解(附最大堆示例代码)
- 算法初级02——荷兰国旗问题、随机快速排序、堆排序、桶排序、相邻两数的最大差值问题、工程中的综合排序算法
- 最近在写的赫夫曼树、B树、二项堆等都会用到堆排序,所以把最大堆排序和最小堆排序一次性先给大家看看
- 最大堆、最小堆、堆排序
- C++实现数组最大堆排序
- 排序算法复习:直接插入排序、堆排序、快排、冒泡排序
- 排序算法-堆排序
- 排序算法_堆排序
- 堆排序和优先队列【最大堆】
- 排序算法整理之堆排序
- 排序算法---堆排序
- 《排序算法》——堆排序(大顶堆,小顶堆,Java)
- 排序算法之堆排序
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 排序算法:希尔、归并、快速、堆排序
- 排序算法之堆排序(Heapsort)解析