您的位置:首页 > 其它

排序算法:堆排序

2017-03-16 08:47 337 查看
在没有学习堆排序算法的时候,将堆排序理解成了二叉排序树。
堆的定义为:二叉树中任意具有子节点的节点,它的两个子节点的元素值都不大于(或不小于)当前节点的元素值,称为大顶堆(或小顶堆);
那么堆排序算法的基本原理是每次构造一个小顶堆,那么堆的根节点就是序列的最小值,然后利用剩余的元素再构造一个小顶堆,获得第二个较小的元素,递归运行直到剩余1个元素返回,最终将得到升序排列的序列。

C++代码实现:
#include <iostream>
#include <vector>

using namespace std;

template<typename T>
void HeapSort(T* vec, int VSize);

int main()
{
int att[] = { 10, 4, 23, 46, 20, 5, 3, 88, 8, 44, 53, 25, 86, 32, 16, 11, 100, 42, 17 };
int VSize = sizeof(att) / sizeof(int);
HeapSort(att, VSize);

for (int vIdx = 0; vIdx < VSize; vIdx++)
cout << "vIdx = " << vIdx << " value = " << att[vIdx] << endl;

return 0;
}

template<typename T>
void HeapSort(T* vec, int VSize)
{
if (VSize <= 1)
return;

// Create Heap
for (int vIdx = 0; vIdx < VSize/2; vIdx++)
{
bool upgrade = false;
if ((vIdx * 2 + 1 < VSize) && (vec[vIdx] > vec[vIdx * 2 + 1]))
{
vec[vIdx] ^= vec[vIdx * 2 + 1];
vec[vIdx * 2 + 1] ^= vec[vIdx];
vec[vIdx] ^= vec[vIdx * 2 + 1];
upgrade = true;
}

int tmpIdx = vIdx;
while (upgrade)
{
upgrade = false;
if (tmpIdx > 0)
{
if (vec[tmpIdx] < vec[tmpIdx / 2])
{
vec[tmpIdx] ^= vec[tmpIdx / 2];
vec[tmpIdx / 2] ^= vec[tmpIdx];
vec[tmpIdx] ^= vec[tmpIdx / 2];
upgrade = true;
tmpIdx /= 2;
}
}
}

if ((vIdx * 2 + 2 < VSize) && (vec[vIdx] > vec[vIdx * 2 + 2]))
{
vec[vIdx] ^= vec[vIdx * 2 + 2];
vec[vIdx * 2 + 2] ^= vec[vIdx];
vec[vIdx] ^= vec[vIdx * 2 + 2];
upgrade = true;
}

tmpIdx = vIdx;
while (upgrade)
{
upgrade = false;
if (tmpIdx > 0)
{
if (vec[tmpIdx] < vec[tmpIdx / 2])
{
vec[tmpIdx] ^= vec[tmpIdx / 2];
vec[tmpIdx / 2] ^= vec[tmpIdx];
vec[tmpIdx] ^= vec[tmpIdx / 2];
upgrade = true;
tmpIdx /= 2;
}
}
}
}

HeapSort(vec + 1, VSize - 1);

//for (int vIdx = 0; vIdx < VSize; vIdx++)
//{
// cout << "vIdx = " << vIdx << " value = " << vec[vIdx] << endl;
//}

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