//实现堆排序算法
#include<stdio.h>
#include<malloc.h>
#define MAXE 20
typedef int KeyType;
typedef char InfoType[10];
typedef struct
{
KeyType key;
InfoType data;
}RecType;
void DispHeap(RecType r[],int i,int n)//按递增有序进行直接插入排序
{
if(i<=n)
printf("%d ",r[i].key);
if(2*i<=n||2*i+1<n)
{
printf("( ");
if(2*i<=n)
DispHeap(r,2*i,n);
printf(",");
if(2*i+1<=n)
DispHeap(r,2*i+1,n);
printf(" )");
}
}
void Sift(RecType r[],int low,int high)
{
int i=low,j=2*i;
RecType temp=r[i];
while(j<=high)
{
if(j<high && r[j].key<r[j+1].key)
j++;
if(temp.key<r[j].key)
{
r[i]=r[j];
i=j;
j=2*i;
}
else break;
}
r[i]=temp;
}
void HeapSort(RecType r[],int n)
{
int i;
RecType temp;
for(i=n/2;i>=1;i--)
Sift(r,i,n);
printf("初始堆: ");
DispHeap(r,1,n);
printf("\n");
for(i=n;i>=2;i--)
{
printf("交换%d与%d,输出%d\n",r[i].key,r[1].key,r[1].key);
temp=r[1];
r[1]=r[i];
r[i]=temp;
Sift(r,1,i-1);
printf("筛选调整得到堆:");
DispHeap(r,1,i-1);
printf("\n");
}
}
int main()
{
int i,k,n=10;
KeyType a[]={6,8,7,9,0,1,3,2,4,5};
n=sizeof(a)/4;
RecType r[MAXE];
for(i=1;i<=n;i++)
r[i].key=a[i-1];
printf("\n");
printf("初始关键字: ");
for(k=1;k<=n;k++)
printf("%4d",r[k].key);
printf("\n");
for(i=n/2;i>=1;i--)
Sift(r,i,n);
HeapSort(r,n);
printf("最后结果: ");
for(k=1;k<=n;k++)
printf("%2d ",r[k].key);
printf("\n\n");
return 0;
}
数据结构源码笔记(C语言描述)汇总: