您的位置:首页 > 其它

排序算法----堆排序

2014-05-29 00:00 92 查看
堆排序算法使用二叉堆实现排序,树上的每一个节点对应数组中的一个元素。

第一步:使用MAX_HEAPIFY维护一个最大堆(所有孩子节点都必须小于或等于其父节点)。它的输入为一个数组A和一下标i,调用MAX_HEAPIFY时,假设节点i的左右子树都是最大堆。

#define   LEFT(i)   (2 * (i + 1) - 1)
#define   RIGHT(i)  (2 * (i + 1))

#define   EXCHANGE(a,b) (a) = (a) + (b);\
(b) = (a) - (b);\
(a) = (a) - (b)

void MAX_HEAPIFY(int A[],int i,int heap_size)
{
int l = LEFT(i);
int r = RIGHT(i);
int largest = -1;

if(l <= heap_size && A[l] > A[i])
{
largest = l;
}
else
{
largest = i;
}

if(r <= heap_size && A[r] > A[largest])
{
largest = r;
}

if(largest != i)
{
EXCHANGE(A[i],A[largest]);
MAX_HEAPIFY(A,largest,heap_size);
}
}

void BUILD_MAX_HEAP(int A[],int heap_size)
{
for(int i = heap_size / 2;i >=0;--i)
{
MAX_HEAPIFY(A,i,heap_size);
}
}

//堆排序,T(n) = O(nlgn)
void HEAPSORT(int A[],int heap_size)
{
BUILD_MAX_HEAP(A,heap_size);
for(int i = heap_size;i > 0;--i)
{
EXCHANGE(A[heap_size],A[0]);
heap_size -= 1;
MAX_HEAPIFY(A,0,heap_size);
}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: