您的位置:首页 > 其它

堆排序

2014-05-29 15:33 134 查看
#include "stdafx.h"

#define LeftChild(i) (2*(i)+1) //左子树坐标

void Swap(int *x,int *y)
{
int temp = 0;
temp = *x;
*x = *y;
*y = temp;
}

void PercDown(int A[], int i, int N) //i是堆的根节点
{
int child = 0;

while (LeftChild(i)<N) //非叶子节点
{
child = LeftChild(i);

if (child!=N-1 && A[child+1] > A[child])
child++;

if (A[i] < A[child])
Swap(&A[i],&A[child]);
else
break;

i=child;//下一轮跳到i的子树child,即往下跳一层
}
}

void HeapSort(int A[], int N)
{
int i = 0;
for (i=N/2-1; i>=0; i--)
PercDown(A,i,N);//创建堆

for (i=0; i<N-1; i++)
{
Swap(&A[0],&A[N-1-i]);
PercDown(A,0,N-i-1);
}
}

int _tmain(int argc, _TCHAR* argv[])
{
int A[] = {3,5,9,7,1,4,2,0,8,6};
int N = 10;
HeapSort(A,N);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  堆排序