堆排序
来源:互联网 发布:word数据导入excel中 编辑:程序博客网 时间:2024/06/06 05:21
C++
#include <iostream>#include<algorithm>using namespace std;void HeapAdjust(int *a,int i,int size) //调整堆 { int lchild=2*i; //i的左孩子节点序号 int rchild=2*i+1; //i的右孩子节点序号 int max=i; //临时变量 if(i<=size/2) //如果i不是叶节点就不用进行调整 { if(lchild<=size&&a[lchild]>a[max]) { max=lchild; } if(rchild<=size&&a[rchild]>a[max]) { max=rchild; } if(max!=i) { swap(a[i],a[max]); HeapAdjust(a,max,size); //避免调整之后以max为父节点的子树不是堆 } } }void BuildHeap(int *a,int size) //建立堆 { int i; for(i=size/2;i>=1;i--) //非叶节点最大序号值为size/2 { HeapAdjust(a,i,size); } } void HeapSort(int *a,int size) //堆排序 { int i; BuildHeap(a,size); for(i=size;i>=1;i--) { //cout<<a[1]<<" "; swap(a[1],a[i]); //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面 //BuildHeap(a,i-1); //将余下元素重新建立为大顶堆 HeapAdjust(a,1,i-1); //重新调整堆顶节点成为大顶堆 }} int main(){ //int a[]={0,16,20,3,11,17,8}; int a[100]; int size; while(scanf("%d",&size)==1&&size>0) { int i; for(i=1;i<=size;i++) cin>>a[i]; HeapSort(a,size); for(i=1;i<=size;i++) cout<<a[i]<<" "; cout<<endl; } return 0;}
Python
def heapadjust(l,i,size): lchild,rchild=2*i,2*i+1 maxs=i if i<=size: if rchild<=size and l[maxs]<l[rchild]: maxs=rchild if lchild<=size and l[maxs]<l[lchild]: maxs=lchild if maxs!=i: l[maxs],l[i]=l[i],l[maxs] heapadjust(l,maxs,size)def heapsort(l): for x in range(int((len(l)-1)/2),0,-1): heapadjust(l,x,len(l)-1) for x in range(len(l)-1,0,-1): l[1],l[x]=l[x],l[1] heapadjust(l,1,x-1) return l[1:]l=[-1,26,5,77,1,61,11,59,15,48,19]print(heapsort(l))
首位留空,方便节点计算
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- 十一.Scala 闭包
- 初探rtmpdump
- javaweb实现文件上传下载
- 389. Find the Difference
- hdu2767 等价性证明(求强连通分量缩点后的出度和入度为0的个数)
- 堆排序
- XAMPP的安装及端口冲突
- 排序算法(三):计数排序与桶排序
- grails 一对多级联删除
- xcode 下创建文件夹,并在文件夹下创建文件时没有弹出选择界面,直接生成了一个 file
- 主机与VmWare中的系统相互通信的方式
- java 环境配置
- 【Unity】 Unity单例模式的使用
- 【CC2650】——电池电量报文显示