Max_Heap_Sort排序的基本原理及步骤
基本原理:利用最大堆堆顶记录的是最大的关键字这一特性。
详细步骤如下:
1. 先将待排数据建立成为一个最大堆(最大堆就是根结点的数值不小于左右孩子结点的数值);如文中Build_Max_Heap()函数
2. 然后再将根结点与最后一个叶子结点交换,取出最后一个叶子结点便得到待排数据中最大的结点;如文中Swap()函数
3. 交换之后的堆根结点很有可能不满足堆的性质(也即新的根结点数值很有可能大于左右孩子结点数值),因此对根结点进行一次Max_Heapify(),该函数的作用是通过下溯法通过比较和交换使得新堆的根结点也满足最大堆的性质;
4. 依次这样,直到取出最后一个结点。。。
Max_Heap_Sort排序是原址不稳定排序,它其实是改进的树形选择排序——>通过下溯法使得最大关键字置于堆顶,然后再与最后叶子结点进行交换。
*Max_Heap_Sort排序的时间复杂度是O(NlgN),空间复杂度为O(1)。
测试用例: 运行环境为VS2010
下面以待排数据长度N=20,数据数值范围Range=100和N=10000,Range=1000进行分析说明。
- 当N=20,Range=100时,运行结果如下:
- 当N=10000,Range=1000时,由于数据太长,这里只给出排序所需花费的时间为 Sorting spends about 13ms.
//Codes of the Max_Heap_Sort
void Heap_Sort(int *arr)
{
if(arr==NULL)
return;