堆排序
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个数字后,对其进行从大到小的排序。
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个数字后,对其进行从大到小的排序。