堆排序(Heap Sort)
1991年的计算机先驱奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了著名的堆排序算法( Heap Sort )
建堆:
利用数组下标之间的关系,将数组想象称为一个完全二叉树。
如果要对待排序列进行升序排列,需要建立一个大堆,每次从堆顶拿出最大的记录,放在数组的最后一个位置,然后在进行一次调整堆,然后重复执行直到整个序列有序。
void AdjustDown(int* arr, int n, int root)
{
int parent = root;
int child = parent*2+1;
while(child<n)
{
if(child+1<n && arr[child]<arr[child+1])//选左右孩子中的大的
{
++child;
}
//如果孩子大于父亲就交换
if(arr[parent]<arr[child])
{
Swap(&arr[parent], &arr[child]);
parent = child;
child = parent*2+1;
}
else
{
break;
}
}
}
void HeapSort(int* arr, int n)
{
int end = n-1;
int i = 0;
assert(arr);
//建堆
//从最后一个非空的叶子节点开始调整
for(i=(n-2)/2; i>=0; i--)
{
AdjustDown(arr, n, i);
}
//排序,每次选出最大的放在n-1的位置上
while(end>0)
{
Swap(&arr[0], &arr[end]);
AdjustDown(arr, end, 0);
end--;
}
}