堆排序
2016-05-31 23:31
197 查看
题目:堆排序
分析:降序:小堆;升序,大堆堆排序也是选择排序,时间复杂度为O(NlogN);
函数HeapSort():
思路:步骤1->先进行建堆,降序:小堆;升序:大堆;
步骤2->最小堆堆顶最小值与最后一个叶子结点交换;
步骤3->缩小堆的大小size,将最小值排除;
步骤4->把堆再进行一次向下调整_AdjustDown,保证堆为最小堆;
向下调整函数_AdjustDown():
思路:参数传入最后一个非叶子结点的父亲;那child = 2*root+1;
每一棵子树都进行下调;
如下代码为降序,则实现的是小堆:
代码如下:
<span style="font-size:18px;">#include<assert.h> #include<iostream> using namespace std; //向下调整 void _AdjustDown(int* KOfArr,int k,int root) { int child = root * 2 + 1; while (child < k - 1) { if (child + 1 < k - 1 && KOfArr[child] > KOfArr[child + 1]) { ++child; } if (KOfArr[child] < KOfArr[root]) { swap(KOfArr[child], KOfArr[root]); root = child; child = 2 * root + 1; } else { break; } } } void Print(int* KOfArr, int k) { assert(KOfArr); assert(k > 0); for (int i = 0; i < k; ++i) { cout << KOfArr[i] << " "; } cout << endl; } //降序,小堆 void HeapSort(int* arr,int len) { assert(arr); assert(len > 0); //建堆->从最后一个非叶子结点开始调整 int i = 0; for (i = len-1; i >= 0; --i) { int root = (i - 1) / 2; _AdjustDown(arr, len, root); } i = len; while (i > 1) { swap(arr[0], arr[i - 1]); //先将排好的最小值舍去再向下调整 --i; _AdjustDown(arr,i,0); } } void TestHeapSort() { int arr[10] = { 10, 11, 13, 12, 16, 18, 15, 17, 14, 19 }; HeapSort(arr, sizeof(arr) / sizeof(arr[0])); Print(arr, sizeof(arr) / sizeof(arr[0])); } </span>
测试结果如下图:
相关文章推荐
- linux下安装pip
- Hard-题目15:239. Sliding Window Maximum
- iOS开发UI篇—UITableview控件使用小结
- 深入PHP 第三章笔记
- 图的遍历算法实现DFS,BFS
- 量身定制项目阶段总结(一)
- Hard-题目14:25. Reverse Nodes in k-Group
- SpringMVC之类型转换Converter
- Hard-题目13:72. Edit Distance
- 【C#进阶系列】29 混合线程同步构造
- android 多个activity 加入系统分享
- Android_异步加载1
- Hard-题目12:115. Distinct Subsequences
- Introduction to DirectShow Application Programming
- 软件工程(二十五)
- Mirantis OpenStack Fuel9.0社区版安装测试
- R语言-用stringr包处理字符串
- HTML/CSS/JavaScript实现的2048小游戏
- Java多线程(第七章)
- myeclispe中向mysql中插入中文数据出现??问题解决办法