#include<stdio.h>
void SiftHeap(int r[], int k, int n);
void HeapSort(int r[], int n);
int main(void)
{
int r[]={47,26,35,18,20,7,13,10};
printf("排序前的数组:");
for(int i=0; i<8; i++)
{
printf("%d ",r[i]);
}
HeapSort(r,8);
printf("\n排序后的数组:");
for(int i=0; i<8; i++)
{
printf("%d ",r[i]);
}
return 0;
}
void SiftHeap(int r[], int k, int n)
{
int i,j,temp;
i=k; //置i为要筛的结点,j为i的左孩子
j=2*i+1;
while(j<n) //筛选还没进行到叶子
{
if(j<n-1 && r[j]<r[j+1]) //比较i的左右孩子,j为较大者
j++;
if(r[i]>r[j]) //根节点已经大于左右孩子中的较大者
break;
else{
//被筛选节点与j交换
temp=r[i];
r[i]=r[j];
r[j]=temp;
//被筛选结点位于原结点j的位置
i=j;
i=2*i+1;
}
}
}
void HeapSort(int r[], int n)
{
int i,temp;
for(i=(n-1)/2; i>=0; i--) //创建初始堆,最后一个分支的下标是(n-1)/2
{
SiftHeap(r,i,n);
}
for(i=1; i<=n-1; i++) //重复执行移走堆顶及重建堆的操作
{
temp=r[0];
r[0]=r[n-i];
r[n-i]=temp;
SiftHeap(r,0,n-i); //只需调整根结点
}
}
减治法———堆排序
最新推荐文章于 2023-06-17 16:06:38 发布