堆排序
来源:互联网 发布:乐玩编程助手 编辑:程序博客网 时间:2024/06/07 05:14
#include<stdio.h>
#include<stdlib.h>
//自底向上构建最大堆,然后每次保存最大堆的根节点,即可完成堆排序
//堆排序
int a[11]={0,1,3,2,5,4,7,6,8,10,9};
int heapnum = 10;
void MAX(int i) //在两个最大堆作为新加元素的子节点时,把新构成的堆再次Build成最大堆
{
int l= 2*i;
int r= 2*i+1;
int largest = i;
if(l<=heapnum)
if(a[l] > a[i])
{
largest =l;;
}
if(r<= heapnum)
if(a[r] > a[largest])
{
largest = r;
}
if(largest != i)
{
int temp = a[i];
a[i] = a[largest];
a[largest] = temp;
MAX(largest);
}
}
void BUILD(void) //如果有n个元素构建堆时,有n/2上限个叶节点;依这些叶节点为基础建立整个数组的最大堆,因此i的取值范围是n/2下限到1。
{
int i = heapnum/2;
for(i=heapnum/2;i>=1;i--)
{
MAX(i);
}
}
void SORT(void) //最大堆堆顶的元素是数组中最大的元素,每次排序时将堆顶元素与最后一个元素交换,然后将最大堆中元素数目减1,然后将新形成的堆重新构建成最大堆。这样,每次循环后,堆的第一个数都是数组中最大的数据,然后把其放在数组的最后一位。依次循环即可形成升序排列数组。
{
for(int i=10;i>=2;i--)
{
int temp = a[1];
a[1] = a[i];
a[i] = temp;
heapnum--;
MAX(1);
}
}
void OUT(void)
{
for(int i=1;i<=10;i++)
printf("%d ",a[i]);
}
int main()
{
BUILD();
SORT();
OUT();
return 0;
}
********************************************************************************************************************************************************************************888888
*******************************************************************************************************************************************************************************8888888
#include<stdio.h>
#include<stdlib.h>
int n;
int heapnum;
int a[1000];
void MAX(int i)
{
int l= 2*i;
int r= 2*i+1;
int largest = i;
if(l<=heapnum)
if(a[l] > a[i])
{
largest =l;;
}
if(r<= heapnum)
if(a[r] > a[largest])
{
largest = r;
}
if(largest != i)
{
int temp = a[i];
a[i] = a[largest];
a[largest] = temp;
MAX(largest);
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
heapnum=n;
int i = heapnum/2;
for(i=heapnum/2;i>=1;i--)
{
MAX(i);
}
for(int j=n;j>=2;j--)
{
int temp = a[1];
a[1] = a[j];
a[j] = temp;
heapnum--;
MAX(1);
}
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
}
return 0;
}
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- poj-2718-Smallest Difference(dfs)
- 经典Spring面试题和答案
- 微信小程序模板使用总结
- 什么是IOU
- 计算机视觉中对训练数据处理以提高分类器性能的技巧
- 堆排序
- Select 语句执行顺序以及如何提高Oracle 基本查询效率
- 专业的HTML操作API Aspose.Html 上架 | 附试用版下载
- linux3.* 内核的__setup函数
- 富文本编辑器ueditor的使用实践
- Anaconda 安装程序网址
- 不做高频,量化策略到底能不能战胜抛硬币?
- Kafka vs RocketMQ——单机系统可靠性
- Python--类的高级特性