堆排序是一种选择排序。堆是完全二叉树,大顶锥的每个结点的值都大于或等于其左右孩子结点的值,小顶锥的每个结点的值都小于或等于其左右孩子结点的值。
基本思想:
把数组构造成一个大顶锥,取堆顶的数字,就是最大值,然后把剩下的所有数字再构成一个大顶锥,再取堆顶数字,重复该操作直至取完所有数字,就能得到一个从大到小的有序序列。
实现:
void Swap(int* a,int* b)
{
int temp=*a;
*a=*b;
*b=temp;
}
void PercDown(int A[], int i, int N)
{
int child;
ElementType Tmp;
for (Tmp = A[i]; 2*i+1 < N; i = child){
child = 2*i+1; //注意数组下标是从0开始的,所以左孩子的求发不是2*i
if (child != N - 1 && A[child + 1] > A[child])
++child; //找到最大的儿子节点
if (Tmp < A[child])
A[i] = A[child];
else
break;
}
A[i] = Tmp;
}
void HeapSort(int A[], int N)
{
int i;
for (i = N / 2; i >= 0; --i)
PercDown(A, i, N); //构造堆
for(i=N-1;i>0;--i)
{
Swap(&A[0],&A[i]); //将最大元素(根)与数组末尾元素交换,从而删除最大元素,重新构造堆
PercDown(A, 0, i);
}
}
void Print(int A[],int N)
{
int i;
for(i=0;i<N;i++)
{
printf(" %d ",A[i]);
}
}

1260

被折叠的 条评论
为什么被折叠?



