您的位置:首页 > 理论基础 > 数据结构算法

选择类排序-堆排序

2014-04-16 21:23 302 查看
#include<stdio.h>
#define N 20
int main()
{
void heapSort(int *,int);
int i,a[N+1];
printf("Enter twenty numbers:\n");
for(i=1;i<=N;i++)/*由于堆排序用得是完全二叉树,所以元素的存储必须从1开始*/
scanf("%d",a+i);
heapSort(a,N);
for(i=1;i<=N;i++)
printf("%d ",a[i]);
return 0;
}
/*本函数完成对在数组a[low]到a[high]范围内对在位置low上的节点进行调整*/
void Sift(int *a,int low,int high)
{
int i=low,j=i*2;/*a[j]是a[i]的左孩子结点*/
int temp=a[i];/*保存位置low上的结点*/
while(j<=high)
{
if(j<high&&a[j]<a[j+1])/*若存在右孩子,且右孩子值较大,则把j指向右孩子*/
++j;/*此时j的值是(2*i+1)  */
if(temp<a[j])/*父节点的值比子节点值小,需要进行交换*/
{
a[i]=a[j];/*交换父节点和子节点的值*/
i=j;/*记录调整后原来low节点的位置,以便继续向下调整*/
j=i*2;/*和子节点交换后的low节点的子节点*/
}
else
break;/*调整结束*/
}
a[i]=temp;/*将被调整的low节点的值放入最终位置*/
}
/*堆排序函数*/
void heapSort(int *a,int n)
{
int i,temp;
for(i=n/2;i>=1;--i)/*建立初始堆*/
Sift(a,i,n);
for(i=n;i>=2;--i)/*进行n-1次循环完成堆排序*/
{
temp=a[1];/*以下3句换出了根节点中的元素,将其放入最终位置*/
a[1]=a[i];
a[i]=temp;
Sift(a,1,i-1);/*由于这次只需要调整根节点,而且元素个数减少了1个*/
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐