c语言堆排序
数据结构
排序结果出来一直是错误的,请各位能我看看,感谢!
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50
void buidheap(int a[],int low,int high)
{
int i=low,j=2*i;
int tmp=a[i];
while(j<=high)
{
if(j<high&&a[j]<a[j+1])
{
j++;
}
if(tmp<a[j])
{
a[i]=a[j];
i=j;
j=2*i;
}
else
break;
}
a[i]=tmp;
}
void swap(int *x, int *y)
//指针变量交换两个数的值,函数内部要交换两个数的值要通过指针交换
{
int t = *x;
*x = *y;
*y = t;
}
void heapsort(int a[],int n)
{
int i;
for(i=n/2;i>=1;i--)
buidheap(a,i,n);
for(i=n;i>=2;i--)
{
swap(&a[1],&a[i]);//下标从1到n;每次第一个元素与最后一个元素交换
buidheap(a,1,i-1);//每swap一次,需要build的元素少一个
}
}
int main()
{
int n,a[MaxSize],i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
heapsort(a,n);
for(j=0;j<n;j++)
{
printf("%d ",a[j]);
}
}
//时间复杂度O(logN)
void DwonAdjust(int a, int n, int root)//向下调整,左右子树都为同种堆才能使用
{
int parent = root;
int child = parent * 2 + 1;//默认左孩子
while (child<n)
{
//选出左右孩子中大的那一个,建大堆换一下比较符
if (a[child + 1] > a[child] && child < n - 1)
child++;
if (a[child] > a[parent])
{
Swap(&a[child], &a[parent]);
parent = child;
child = parent * 2 + 1;
}
else
break;
}
}
//整体时间复杂度O(NlogN)
void HeapSort(inta, int n)
{
//建堆,时间复杂度O(N)
for (int i = (n - 2) / 2; i >= 0; i--)//从最后一个非叶节点调
DwonAdjust(a, n, i);
//排升序建大堆
int end = n - 1;
while (end > 0)
{
Swap(&a[0], &a[end]);
DwonAdjust(a, end, 0);
end--;
}
}