数据结构堆排序
来源:互联网 发布:酷家乐橱柜设计软件 编辑:程序博客网 时间:2024/05/24 06:35
#include <bits/stdc++.h>using namespace std;//大顶堆 ,逻辑结构为完全二叉树,存储结构为一维数组 /*小顶堆的插入:每次插入都是将新数据放在数组最后。 // 新加入i结点 其父结点为i/2 void MinHeapFixup(int a[], int i) { int j, temp; temp = a[i]; j = i/2; //父结点 while (j >= 1 && i != 1) { if (a[j] <= temp) break; a[i] = a[j]; //把较大的子结点往下移动,替换它的子结点 i = j; j = i/2; } a[i] = temp; } */ int n;int length;int a[1005];void HeapAdjust(int a[],int s,int m)//筛选,s是要筛选结点的下标,m是最后一个结点下标 {//s,j分别是父结点和左孩子结点的下标 int temp=a[s]; //暂存到temp变量中 for(int j=2*s;j<=m;j*=2)//j是i结点的左孩子下标 {if(j<m&&(a[j]<a[j+1]))//j要小于m,不然j+1就越界了 ++j;//筛选左右孩子最大的结点的下标 if(!(temp<a[j]))//如果temp>=左右孩子,就跳出循环,不用交换 break;a[s]=a[j];//执行到这里,说明要交换 s=j; }a[s]=temp;}void HeapSort(int a[]){for(int i=length/2;i>=1;i--)//对非终端节点依次筛选,从length/2开始(即最后一个非终端结点) {HeapAdjust(a,i,length);}for(int i=length;i>1;--i)//将堆顶与最后一个元素交换,再对[1,i-1]重新调整为大顶堆 {swap(a[1],a[i]);HeapAdjust(a,1,i-1);}}int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];length=n;HeapSort(a);for(int i=1;i<=n;i++)cout<<a[i]<<" "; return 0;}
0 0
- 数据结构-排序-堆排序
- 数据结构 二叉堆 & 堆排序
- 【数据结构】堆、堆排序笔记
- 【数据结构】堆与堆排序
- 数据结构--堆排序
- 【数据结构】堆排序
- 数据结构_堆排序
- 数据结构 - 堆排序
- 数据结构--堆排序
- C++数据结构--堆排序
- 数据结构之堆排序
- 数据结构之堆排序
- 【数据结构&&算法】堆排序
- 【数据结构】堆排序
- [数据结构]堆排序
- 【数据结构】堆排序
- 数据结构-堆排序
- 数据结构之堆排序
- Couldn't deserialize object in variable 'user1' 反序列化失败
- 如何一步一步用DDD设计一个电商网站(十四)—— 回顾与总结
- hihocoder1032:(manacher)
- collection 介绍
- qt 对话框关闭以及自动释放内存
- 数据结构堆排序
- java 冒泡排序
- ORA-00265:instance recovery required, cannot set ARCHIVELOG mode
- 文章标题
- set
- Android Studio 2.2新增布局——ConstraintLayout完全解析
- Servlet综合使用
- Java内存管理:深入Java内存区域
- Java泛型中<? extends E>和<? super E>的区别