标签:art pac water 个数 技术 堆排序 details 表示 输入
之前的博客介绍介绍了数组的两种排序算法:插入排序和归并排序(採用递归),见链接http://blog.csdn.net/u013165521/article/details/46845033。
本篇博客,介绍还有一种排序算法:堆排序。
(内容參照算法导论)
所谓堆,它是一个数组,也能够被看成一个近似的全然二叉树。树上每一个结点相应数组的一个元素。二叉堆分为二种:最大堆和最小堆。本文主要介绍最大堆,最小堆类似。最大堆的特点:对于随意某个结点,该结点的值大于左孩子、右孩子的值,可是左右孩子的值没有要求。
可是,交换后新的根节点可能不满足堆的特点,所以须要调用子函数Max_heapify对剩余的数组元素进行最大堆性质的维护。堆排序算法。通过不断反复这个过程(n-1)次,实现数组的从小到大排序(由于採用最大堆)。
由于子数组A(n/2+1..n)是树的叶子节点,不须要进行堆的维护。
所以。仅仅须要对A[1..n/2]数组元素进行维护。就可构建堆。
此时,以A[largest]为根节点的子树可能不满足堆的性质,所以须要递归调用自身。
#include <stdlib.h> #include <stdio.h> #include <iostream> using namespace std; void Swap(int *x, int *y); void Max_heapify(int array[], int i, int heap_size); void Build_max_heap(int array[],int len); void Heapsort(int array[],int len); void Swap(int *x, int *y) { int temp; temp=*x; *x=*y; *y=temp; } void Max_heapify(int array[], int i, int heap_size) { int largest; int _left=2*i; int _right=2*i+1; if (_left<=heap_size && array[_left]>array[i]) { largest=_left; } else largest=i; if (_right<=heap_size && array[_right]>array[largest]) { largest=_right; } if (largest!=i) { Swap(&array[largest],&array[i]); Max_heapify(array,largest,heap_size); } } void Build_max_heap(int array[],int len) { int heap_size=len; for (int i=len/2; i>=1; i--) { Max_heapify(array,i,heap_size); } } void Heapsort(int array[],int len) { int heap_size=len; Build_max_heap(array,len); for (int i=len; i>=2; i--) { Swap(&array[1],&array[i]); heap_size--; Max_heapify(array,1,heap_size); } } void main() { int array[]={0,14,10,8,7,9,3,2,4,1}; int len=9; Heapsort(array,len); cout<<"heap sort result:\n"; for (int i=1; i<=len; i++) { cout<<array[i]<<" "; } cout<<endl; }
标签:art pac water 个数 技术 堆排序 details 表示 输入
原文地址:http://www.cnblogs.com/claireyuancy/p/7157234.html