堆排序
来源:互联网 发布:网络维护难点分析 编辑:程序博客网 时间:2024/06/05 05:19
思想:我认为这个排序最坑的地方是它开的数组从1记起(我因为0这个问题纠结了好久···),建大顶堆,每次顶和最后的叶子作比较,如果顶小,
做交换,每循环一次确定好一个数的位置;建堆时最大非叶子节点为n/2,循环里每次建堆,左面下标成2*i排列,右面下标成2*i+1排列
解题代码:
#include <stdio.h>
#define N 100000
void Input(int a[],int n)
{
int i;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
}
void swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
void Adjust(int a[],int i,int n)
{
int lchild=2*i;
int rchild=2*i+1;
int max=i;
if(i<=n/2)
{
if(lchild<=n&&a[lchild]>a[max])
{
max=lchild;
}
if(rchild<=n&&a[rchild]>a[max])
{
max=rchild;
}
if(max!=i)
{
swap(&a[i],&a[max]);
Adjust(a,max,n);
}
}
}
void Build(int a[],int n)
{
int i;
for(i=n/2;i>=1;i--)
{
Adjust(a,i,n);
}
}
void Heap(int a[],int n)
{
int i;
Build(a,n);
for(i=n;i>=1;i--)
{
swap(&a[1],&a[i]);
Adjust(a,1,i-1);
}
}
void Output(int a[],int n)
{
int i;
for(i=1;i<=n;i++)
printf("%d ",a[i]);
}
int main()
{
int a[N],n;
printf("请输入数据个数:\n");
scanf("%d",&n);
Input(a,n);
Heap(a,n);
Output(a,n);
return 0;
}
做交换,每循环一次确定好一个数的位置;建堆时最大非叶子节点为n/2,循环里每次建堆,左面下标成2*i排列,右面下标成2*i+1排列
解题代码:
#include <stdio.h>
#define N 100000
void Input(int a[],int n)
{
int i;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
}
void swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
void Adjust(int a[],int i,int n)
{
int lchild=2*i;
int rchild=2*i+1;
int max=i;
if(i<=n/2)
{
if(lchild<=n&&a[lchild]>a[max])
{
max=lchild;
}
if(rchild<=n&&a[rchild]>a[max])
{
max=rchild;
}
if(max!=i)
{
swap(&a[i],&a[max]);
Adjust(a,max,n);
}
}
}
void Build(int a[],int n)
{
int i;
for(i=n/2;i>=1;i--)
{
Adjust(a,i,n);
}
}
void Heap(int a[],int n)
{
int i;
Build(a,n);
for(i=n;i>=1;i--)
{
swap(&a[1],&a[i]);
Adjust(a,1,i-1);
}
}
void Output(int a[],int n)
{
int i;
for(i=1;i<=n;i++)
printf("%d ",a[i]);
}
int main()
{
int a[N],n;
printf("请输入数据个数:\n");
scanf("%d",&n);
Input(a,n);
Heap(a,n);
Output(a,n);
return 0;
}
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- K60系列学习(四)Start.s启动代码分析
- Group by与having理解
- thread 4, queue
- UVa 10267 Problem: Graphical Editor (PC 110105)
- ACM HDOJ 1042 (N!)
- 堆排序
- android系统如何自适应屏幕大小
- 36条微信公众账号运营的心得总结
- pc指针与流水线的关系
- TCP连接释放
- What is an ORA-600 Internal Error? (文档 ID 146580.1)
- 人生之梦
- ACM HDOJ 1047 (Integer Inquiry)
- Red5-1.0.0+flowpalyer搭建简易flv流媒体网站