算法分析:堆排序
2017-01-11 14:38
176 查看
基本原理就是构建一个堆,然后删除根。
为了不用一个新的堆,把抽取出来的数据,放在堆末尾。
所以,要实现一个升序排序,就要构建一个最大堆,不停抽取最大数,放到末尾处。
为了不用一个新的堆,把抽取出来的数据,放在堆末尾。
所以,要实现一个升序排序,就要构建一个最大堆,不停抽取最大数,放到末尾处。
//----------------堆排序-------------------- template<typename Comparable> void heapsort(Vector<Comparable>& a) { //构建堆,从二分一后的点都是在最底层的,所以往回执行下滤,一路向上,构建一个最大堆 for (int i = a.size() / 2; i >= 0; i--) { percDown(a, i, a.size()); } for (int j = a.size() - 1; j > 0; j--) { //交换头尾,得出最大的值在队尾,堆减少, Comparable temp = a[0]; a[0] = a[j]; a[j] = temp; //破坏了堆结构,执行下滤 percDown(a, 0, j); } } int leftChild(int i) { return 2 * i + 1; } template<typename Comparable> void percDown(Vector<Comparable>& a, int i, int n) { int child; Comparable tmp = a[i];//当前需要下滤的实体 for ( ; leftChild(i) < n; i = child) { child = leftChild(i);//左边的儿子 if (child != n -1 && a[child] < a[child + 1]) { child++;//左边的儿子比右边的儿子小,这是找大的一个 } if (tmp < a[child])//比儿子小 { a[i] = a[child]; } else { break; } } a[i] = tmp; }
相关文章推荐
- 堆排序中--建堆的算法复杂度分析O(n)
- 一步步学习数据结构和算法之堆排序效率分析及java实现
- 堆排序及算法分析
- 算法分析-选择排序(直接选择排序 & 堆排序)
- 快排 和 堆排序算法的细节代码分析
- 【算法分析】排序算法:希尔、归并、快速、堆排序
- 【算法分析】排序算法:希尔、归并、快速、堆排序
- 算法数据结构C++实现8 堆排序 难点分析
- 堆排序详细分析(算法导论第六章)
- 算法分析之——heap-sort堆排序
- 冒泡排序、选择排序、堆排序、快速排序、插入排序算法复杂度分析与算法实现(自己总结与转)
- 数据结构和算法分析之排序算法--选择排序(堆排序)
- 【算法分析】排序算法:希尔、归并、快速、堆排序
- 冒泡排序、选择排序、堆排序、快速排序、插入排序算法复杂度分析与算法实现(自己总结与转)
- 算法分析之——heap-sort堆排序
- DatabaseTool注册算法分析
- XoftSpy 4.13的注册算法分析 zz
- 冒泡排序的算法分析与改进
- 冒泡排序的算法分析与改进 (选择自 Uncommon 的 Blog )
- TimeRecorder V4.17.3简单算法分析