#include "stdafx.h"
#include <stdio.h>
#include <string>
#include <iostream>
#include <queue>
#include <exception>
#include <cmath>
using namespace std;
#define SIZE 10
//维持堆的性质(假设i的左右两支已经符合大堆的性质)
void MaxHeapify(int data[], int index, int length)
{
int Left = (index << 1) ;
int Right = (index << 1) + 1;
int Largest = index;
int temp = 0;
//2i > n 无左孩子
if(Left <= length && data[Left] > data[index])
Largest = Left;
else
Largest = index;
// 2i + 1 > n 无右孩子
if(Right <= length && data[Right] > data[Left])
Largest = Right;
if(Largest != index)
{
temp = data[Largest];
data[Largest] = data[index];
data[index] = temp;
MaxHeapify(data, Largest, length);
}
}
//构建初始大根堆
void BuidMaxDeap(int data[], int length)
{
int index = length >> 1;
//i / 2 - 1 的节点为非叶节点, 是需要调整的节点
for(index ; index >= 1; --index)
{
MaxHeapify(data, index, SIZE);
}
}
//堆排序
void HeapSort(int data[], int length)
{
int temp = 0;
BuidMaxDeap(data, length);
for(int i = length; i >= 2; --i)
{
temp = data[1];
data[1] = data[i];
data[i] = temp;
MaxHeapify(data, 1, i - 1);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int Deapdata[SIZE + 1] = {0, 4, 1, 3, 2, 16, 9, 10, 14, 8, 7};
HeapSort(Deapdata, SIZE);
for(int i = 0; i < 11; ++i)
{
cout<<"a["<<i<<"]="<<Deapdata[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}
#include <stdio.h>
#include <string>
#include <iostream>
#include <queue>
#include <exception>
#include <cmath>
using namespace std;
#define SIZE 10
//维持堆的性质(假设i的左右两支已经符合大堆的性质)
void MaxHeapify(int data[], int index, int length)
{
int Left = (index << 1) ;
int Right = (index << 1) + 1;
int Largest = index;
int temp = 0;
//2i > n 无左孩子
if(Left <= length && data[Left] > data[index])
Largest = Left;
else
Largest = index;
// 2i + 1 > n 无右孩子
if(Right <= length && data[Right] > data[Left])
Largest = Right;
if(Largest != index)
{
temp = data[Largest];
data[Largest] = data[index];
data[index] = temp;
MaxHeapify(data, Largest, length);
}
}
//构建初始大根堆
void BuidMaxDeap(int data[], int length)
{
int index = length >> 1;
//i / 2 - 1 的节点为非叶节点, 是需要调整的节点
for(index ; index >= 1; --index)
{
MaxHeapify(data, index, SIZE);
}
}
//堆排序
void HeapSort(int data[], int length)
{
int temp = 0;
BuidMaxDeap(data, length);
for(int i = length; i >= 2; --i)
{
temp = data[1];
data[1] = data[i];
data[i] = temp;
MaxHeapify(data, 1, i - 1);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int Deapdata[SIZE + 1] = {0, 4, 1, 3, 2, 16, 9, 10, 14, 8, 7};
HeapSort(Deapdata, SIZE);
for(int i = 0; i < 11; ++i)
{
cout<<"a["<<i<<"]="<<Deapdata[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}
本文介绍了一种使用C++实现的大根堆及其堆排序算法。通过定义MaxHeapify函数来维护堆的性质,并利用BuidMaxDeap函数构建初始大根堆,最后通过HeapSort函数完成对数组的排序。提供了完整的代码示例并展示了排序后的结果。
699

被折叠的 条评论
为什么被折叠?



