首页 > 代码库 > 算法导论之 堆排序研究
算法导论之 堆排序研究
参考文献1:算法导论第六章讲解 堆排序
参考文献2:<a target=_blank href=http://www.mamicode.com/"http://blog.csdn.net/xiaoxiaoxuewen/article/details/7570621">http://blog.csdn.net/xiaoxiaoxuewen/article/details/7570621
/****************************************************************************/ /*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; }
算法导论之 堆排序研究
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。