排序算法C++ && Python实现---堆排序
来源:互联网 发布:虚拟主机数据库在哪里 编辑:程序博客网 时间:2024/05/16 10:42
堆排序是利用“堆”的概念,将一列数进行排序。本文首先介绍“堆”的定义,说明“堆”排序的过程和解决思路,最后利用C++和Python实现算法。
堆的定义
具有n个元素的序列(k1,k2,...,kn ),当且仅当满足:
{ki≤k2iki≤k2i+1 (小顶堆) 或{ki≥k2iki≥k2i+1 (大顶堆)
时,称之为“堆”。由堆的定义可看出,堆顶元素为最小值或最大值。堆排序过程
首先将一维数组存储的二叉树序列,通过调整其中元素的位置,使之成为一个“堆”,将其堆顶元素输出,然后调整剩下的n−1 个元素使之成为一个堆,直到剩下两个元素,则交换他们的顺序,即可得有序序列。解决思路
(1)建立初始“堆”
a.对于有n 个节点的二叉树,其最后一个节点是n/2 个节点的子树
b.从n/2 个节点开始筛选,直到第一个节点结束。筛选过程如(2)所述。
(2)筛选过程
假设原先的m 个数据已构成堆,输出堆顶元素后,还剩m−1 个元素。
a.将堆尾元素放入堆顶;
b.比较堆顶元素与其子节点,是否满足堆的条件,若不满足,则与其子节点中较大者交换;
c.向下判断左子节点,是否满足堆的条件,若不满足,则与其字节点中较大者交换;
d.判断右子节点,是否满足堆的条件,若不满足,则与其子节点中较大者交换。
e.重复a、b、c、d,直到判断结束,到达最后一个节点。C++实现
//打印排序结果函数void Print(int a[],int n,int i=0){ //cout<<i<<endl; cout<<"排序后的结果为:"<<endl; for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl;}//堆排序void HeapAdjust(int a[],int s,int n) //s为需要调整的堆元素位置{ int child=2*s+1; //左子节点位置 while (child<n) { if(child+1<n && a[child]<a[child+1]) { child++; } if(a[s]<a[child]) { int tem=a[s]; //储存,用于交换 a[s]=a[child]; a[child]=tem; s=child; child=2*s+1; }else{break;} } }void buildHeap(int a[],int n) //建立初始堆{ for(int i=(n-1)/2;i>=0;i--) //最后一个节点所在父节点位置为(n-1)/2 { HeapAdjust(a,i,n); }}void HeapSort(int a[],int n){ buildHeap(a,n); for(int i=n-1;i>0;i--) { int temp; temp=a[i];a[i]=a[0];a[0]=temp; HeapAdjust(a,0,i); } Print(a,n);}
5.Python实现
'''输出排序结果函数'''def Print(ddata): n=len(ddata) for i in range(n): print ddata[i], #其中","为了不让其输出默认的换行符'''堆排序'''def heapAdjust(data,s,n): #堆调整函数,data---数据,s---为待调整节点位置,n---数据长度 child=2*s+1 while(child<n): if(child+1<n and data[child]<data[child+1]): child+=1 if(data[s]<data[child]): data[s],data[child]=data[child],data[s] s=child child=2*s+1 else: break return datadef buildHeap(data,n): #建立初始堆 for i in range(-1,(n-1)/2)[::-1]: #[::-1]实现倒序循环 data=heapAdjust(data,i,n) return datadef heapSort(data,n): data=buildHeap(data,n) for i in range(n-1)[::-1]: data[0],data[i]=data[i],data[0] data=heapAdjust(data,0,i) Print(data)
阅读全文
0 0
- 堆排序算法实现 Python
- 排序算法C++ && Python实现---堆排序
- 排序算法(C实现)--------- 堆排序
- 排序算法总结(简单选择排序、堆排序)(python实现)
- 【排序】用Python实现八大排序算法--堆排序
- Python:堆排序算法
- python 实现堆排序算法代码
- python算法--堆排序详细实现
- python算法实现系列-堆排序
- 算法导论堆排序python实现
- Python之堆排序算法实现
- 排序算法—堆排序算法分析与实现(Python)
- 排序算法 - 堆排序 (C++)
- 排序算法C++&&Python实现---冒泡排序
- 排序算法C++&&Python实现---归并排序
- 排序算法C++&&Python实现---归并排序
- 堆排序算法实现(C++)
- 堆排序算法(C & Java 实现)
- Vue.js自定义下拉列表,如何实现在下拉列表区域外点击即可关闭下拉列表的功能
- 初学-HTML
- PCL_超体聚类实现
- (一) CentOS7下RPM安装MYSQL-5.7.18
- C++中子类构造函数写法总结
- 排序算法C++ && Python实现---堆排序
- 计蒜客 商汤科技的行人检测(困难)
- Effective Java
- 如何在word文档中插入参考文献,并管理参考文献
- wcftestclient.exe测试WCF服务
- 利用分治法解决凸包问题
- ASIC设计中各个阶段需要注意的问题
- C++ 知识点
- ubuntu 安装 python 虚拟环境