您的位置:首页 > 其它

堆排序

2018-01-22 10:23 162 查看
堆排序是一种特殊的树形数据结构,其每个节点都有一个值,通常提到的堆都是指一棵完全二叉树,根节点的值小于(或大于)两个子节点的值,同时根节点的两个子树也分别是一个堆。堆排序主要包括两个过程:一是构建堆,二是交换堆顶元素与最后一个元素的位置。

#include <stdio.h>

void DisArray(int a[],int n);
void AdjustHeap(int a[],int s,int m);
void CreateHeap(int a[],int n);
void HeapSort(int a[],int n);

int main()
{
int a[]={67,48,23,81,38,19,52,40};
int n=sizeof(a)/sizeof(a[0]);
printf("排序前:");
DisArray(a,n);
HeapSort(a,n);
printf("排序后:");
DisArray(a,n);
return 0;
}

void DisArray(int a[],int n)//打印
{
int i;
for(i=0;i<n;i++)
{
printf("%4d",a[i]);
}
printf("\n");
}

void CreateHeap(int a[],int n)//创建堆
{
int i;
for(i=n/2-1;i>=0;i--)
{

AdjustHeap(a,i,n-1);
}
}

void AdjustHeap(int a[],int s,int m)//调整堆
{
int t,j;
t=a[s];
for(j=2*s+1;j<=m;j*=2+1)
{
if(j<m&&a[j]<a[j+1])
{
j++;
}
if(t>a[j])
{
break;
}
else
{
a[s]=a[j];
s=j;
}

}
a[s]=t;
}

void HeapSort(int a[],int n)
{
int t,i;
CreateHeap(a,n);
for(i=n-1;i>0;i--)
{
t=a[0];
a[0]=a[i];
a[i]=t;
printf("第%d趟排序结果:",n-1);
DisArray(a,n);
AdjustHeap(a,0,i-1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: