您的位置:首页 > 其它

堆排序

2017-03-19 22:54 148 查看
先建立堆结构,在从下往上对每一个点进行调整。具体原理可以参照一个网站:
https://visualgo-translation.club/zh
#include<stdio.h>
//堆排序从大到小

void swap(int a[],int x,int y)
{
int temp;
temp=a[x];
a[x]=a[y];
a[y]=temp;
}

void insert(int a[],int i,int value)
{
int temp,j;
a[i]=value;
temp=a[i];
j=(i-1)/2; //j为父节点
while(j>=0 && i>0) //从下向上找插入点
{
if(temp>=a[j]) //找到一个比插入点小的父节点
break;

a[i]=a[j];
i=j;
j=(i-1)/2;//向上找
}
a[i]=temp; //更新子节点
}

void fix(int a[],int i,int n) //从i结点开始调整,向下调整至节点n
{
int temp,j;
temp=a[i];
j=2*i+1; //j为子节点
while(j<n)
{
if(j+1<n && a[j+1]<a[j])//寻找左右节点最小的
j++;
if(temp<=a[j])
break;

a[i]=a[j];
i=j;
j=2*i+1;
}
a[i]=temp;
}

int main(void)
{
int a[10]={0},i,x;
for(i=0;i<10;i++)
{
scanf("%d",&x);
insert(a,i,x);
}
for(i=10-1;i>=1;i--)
{
swap(a,i,0);
fix(a,0,i);
}
for(i=0;i<10;i++)
printf("%d ",a[i]);
}
 输入10个数字后,对其进行从大到小的排序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: