参考文献1:算法导论第六章讲解 堆排序
参考文献2:<a target=_blank href="http://blog.csdn.net/xiaoxiaoxuewen/article/details/7570621">http://blog.csdn.net/xiaoxiaoxuewen/article/details/7570621</a>
/****************************************************************************/ /*time:2014.11.15 author:chen stallman */ /*1.如何建立最大堆 */ /*2.把数组转换成最大堆 */ /*3.把建好的堆中数据与原数组进行数据交换 */ /******************************************************************************/ #include<iostream> #include<algorithm> using namespace std; void swap(int *x, int *y) { int tmp = *x; *x = *y; *y = tmp; } //建立以root为i(即根节点为i)的最大堆,利用了递归的思想防止调整之后以largest为父节点的子树不是最大堆 void max_heapify(int a[], int i, int heapsize) { int l = 2 * i;//取其左孩子的坐标 int r = 2 * i + 1;//取其右孩子的坐标 int largest;//临时变量,用来保存r、l、r三个节点中最大的值 if (l<=heapsize&&a[l]>a[i]) largest = l; else largest = i; if (r<=heapsize&&a[r]>a[largest]) largest = r; if (largest != i) { swap(&a[i], &a[largest]); max_heapify(a, largest, heapsize); } } //*********************************************** //用自底向上的方法把数组转换成最大堆 void buil_max_heap(int a[], int heapsize) { int i; for (i = heapsize / 2; i >= 1; i--) { max_heapify(a, i, heapsize); } } //有了上面这个两个辅助功能函数就可以对数组进行堆排序了 void heap_sort(int a[], int len) { int i; buil_max_heap(a, len); for (i = len; i >= 2; i--) { swap(&a[1], &a[len]); len--; max_heapify(a, 1, len); } } int main() { //这里数组下标从1开始,数组第一个元素没有使用 int a[] = { 0,12,-3,88,52,6,4,33,2,100,5,20}; heap_sort(a, 11); for (auto i : a) cout << i << " "; cout << endl; return 0; }
原文地址:http://blog.csdn.net/chenxun_2010/article/details/41131445