您的位置:首页 > 其它

【排序算法】之堆排序的实现

2015-12-10 16:21 239 查看
#include<iostream>
using namespace std;

/*
1:找到第一个非叶子节点的位置cur:数组元素个数size/2-1
2:从cur开始,依次将各子树调整为最大堆--->整体成为最大堆
3:堆顶元素与数组最后一个元素交换
4:数组元素减1,重复执行上述操作
*/
void AdjustUp(int *arr, int size)
{
int cur = size / 2 - 1;//指向第一个非叶子节点
while (cur >= 0)
{
int left = cur * 2 + 1;//该节点的左孩子
int max = left;
int right = left + 1;  //该节点的右孩子
//求出左右孩子中较大的节点
if (right < size&&arr[right] > arr[max])
{
max = right;
}
//左右孩子中较大的节点,与根节点比较,根节存放较大值
if (arr[max] > arr[cur])
{
swap(arr[max], arr[cur]);
}
//为下一颗树调整做准备
cur--;
}
}
void HeapSort(int *arr, int size)
{
for (int i = size; i > 1; --i)
{
AdjustUp(arr, i);//调整为最大堆
swap(arr[0], arr[i - 1]);
//1:将堆顶元素与数组最后一个元素交换
//2:然后堆元素个数减1,重新调整为最大堆,重复1操作
}
}
void Print(int *arr, int size)
{
for (int i = 0; i < size; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
}

int main()
{
int arr[] = { 2, 9, 7, 15, 8, 21, 12, 100, 99 };
int size = sizeof(arr) / sizeof(arr[0]);

HeapSort(arr, size);
Print(arr, size);
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  排序算法 堆排序