您的位置:首页 > 编程语言 > C语言/C++

用C++实现堆排序

2016-05-16 19:58 357 查看
堆数据结构是一种数组对象,它可以被视为一颗完全二叉树结构。
最大堆:每个父节点都大于孩子节点。
最小堆:每个父节点都小于孩子节点。
堆排序的思想:对于给定的N个数据,初始时把这些记录看作是一颗顺序存储的二叉树,然后将其调整为一个最大堆,然后将堆的最后一个元素与堆顶元素(即二叉树的根节点)进行交换,堆的最后一个元素即为最大记录;接着将(N-1)个元素(即不包括最大记录)重新调整为一个最大堆,再将堆顶元素与堆的最后一个元素进行交换后得到次大的记录,重复该过程直到调整的堆只剩下一个元素为止,该元素即为最小记录,此时可得到一个有序序列。
堆排序主要包括两个过程:一是构建堆;二是交换堆顶元素与最后一个元素的位置。

程序如下:
#include<iostream>
#include<assert.h>
using namespace std;

void AdjustDown(int *array,int size,int root)
{
assert(array);
int child = 2 * root + 1;
while (child < size)
{
if (child + 1 < size&&array[child] < array[child + 1])
{
++child;
}
if (array[child]>array[root])
{
swap(array[root],array[child]);
root = child;
child = 2 * root + 1;
}
else
{
break;
}
}
}

void HeapSort(int *array, int size, int root)
{
//找到第一个非叶子节点构建堆
for (int i = (size - 2) / 2; i >= 0; --i)
{
AdjustDown(array,size,0);
}
for (int i = 0; i < size; ++i)
{
swap(array[0],array[size-1-i]);
AdjustDown(array,size-1-i,0);
}
}

int main()
{
int array[10] = {12,10,16,6,8,9,11,9,7,13};
for (int i = 0; i < 10; ++i)
{
cout << array[i] << " ";
}
cout << endl;
HeapSort(array,10,0);
for (int i = 0; i < 10; ++i)
{
cout << array[i] << " ";
}
cout << endl;
return 0;
}
程序运行结果:




堆排序方法对记录较少的文件效果一般,但对于 记录较多的文件还是很有效的,其运行时间主要耗费在创建堆和反复调整堆上。堆排序即使在最坏的情况下,其时间复杂度也为O(N*logN)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  排序