博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
推排序
阅读量:4678 次
发布时间:2019-06-09

本文共 1149 字,大约阅读时间需要 3 分钟。

     这篇博客讨论一下堆排序。

 

    堆排序就是利用堆这种数据结构来实现排序,堆具有堆序性,最小堆的最小值一定在开头,最大堆的最大值也在开头,因此,我们可以利用堆来排序。

 

    我们选用最大堆来排序,首先在原来的数组上构建一个最大堆,因此数组的开头就是最大值,我们把这个最大值和堆的最后一个元素交换位置,同时堆的大小减一,再整理堆,如此循环,最后的结果就是排好序的数组。

 

  代码如下:

 

#include
using namespace std;int A[13] = {81,94,11,96,12,35,17,95,28,58,41,75,15};#define LeftChild(i) (2 * (i) + 1) //标号从0开始,因此左儿子在2i + 1处//最大堆,最大值在开头void PercDown (int A[],int i, int N){ int Child; int Tmp; for(Tmp = A[i]; LeftChild(i) < N; i = Child) { Child = LeftChild(i); if(Child != N-1 && A[Child + 1] > A[Child]) //寻找较大的儿子 Child++; if(Tmp < A[Child]) A[i] = A[Child]; else break; } A[i] = Tmp;}void Swap(int &a, int &b){ int c; c = a; a = b; b = c;}void Heapsort (int A[], int N){ int i; for(i = N / 2; i >= 0; i--) //在数组上构建最大堆 PercDown(A,i,N); for(i = N - 1; i > 0; i--) { Swap(A[0],A[i]); //开始排序,把最大值换到后面去 PercDown(A,0,i); //整理堆,剩下元素的最大值会回到开头 }}int main (){ Heapsort (A, 13); for(int i = 0; i != 13; ++i) { cout << A[i] << " "; } cout << endl; return 0;}

  堆排序相对来说还是比较快的排序方法。

 

    夜深了,,,

   

   推荐一首歌 《塘桥夜话》

  

转载于:https://www.cnblogs.com/1242118789lr/p/6842501.html

你可能感兴趣的文章
BZOJ2244 [SDOI2011]拦截导弹 【cdq分治 + 树状数组】
查看>>
ASP.NET Web API 控制请求频率
查看>>
教你几种在SQLServer中删除重复数据方法(转)
查看>>
iOS中的图像处理(一)——基础滤镜
查看>>
Java中int类型和tyte[]之间转换及byte[]合并
查看>>
silverlight2 游戏 1 你能坚持多少秒
查看>>
数组元素java集合源代码分析(一)
查看>>
一边学习一边爱着梦着一边生活
查看>>
线性结构与非线性结构
查看>>
ID:12031 全排列
查看>>
SpringMVC注解版前台向后台传值的两种方式(IDEA)
查看>>
从Google Earth 中下载三维模型
查看>>
java.lang.ClassNotFoundException: org.hibernate.engine.FilterDefinition的解决方案
查看>>
柔性数组(用于结构体)
查看>>
讲解下for循环的用法,加深记忆
查看>>
使用Spring.Net
查看>>
002-BootStrap基本模板
查看>>
HttpClient使用详细教程
查看>>
Python黑科技:赋值技巧
查看>>
mybatis insert前获取要插入的值
查看>>