您的位置:首页 > 其它

堆排序_heap_sort

2014-02-15 09:55 337 查看
#include <iostream>
#include <vector>
#include <conio.h>

using namespace std;

class DataType:public vector<int>
{
public:
int heapSize;
DataType():heapSize(0){};
~DataType(){};
protected:
private:
};

/*
将index为结点的子树调整为最大堆,保持最大堆的性质,以index的左右孩子为根的二叉树必须也是最大堆。
*/
void max_heapify(DataType &data, int index)
{
int l = index << 1;		//计算左孩子
int r = l + 1;			//得到右孩子

//找出该节点和其左右孩子中最大的
int largest = 0;
if (l <= data.heapSize && data[l] > data[index])
{
largest = l;
}
else
{
largest = index;
}

if (r <= data.heapSize && data[r] > data[largest])
{
largest = r;
}

//若该节点不为最大,则与最大的交换,并在最大的节点处递归调用该函数。
if (largest != index)
{
int temp = data[index];
data[index] = data[largest];
data[largest] = temp;

max_heapify(data, largest);
}
}

/*
建立最大堆
*/
void buile_max_heap(DataType &data)
{
//因为为了方便,data[0]为设定的0,所以要减一
data.heapSize = data.size() - 1;
for (int i = data.heapSize / 2; i > 0; i--)
{
max_heapify(data, i);
}

}

/*
堆排序算法
*/
void heap_sort(DataType &data)
{
//建立最大堆
buile_max_heap(data);
//将最大值交换到最后,并调用max_heapify使堆保持最大堆的性质
for (int i = data.size() - 1; i > 1; i--)
{
int temp = data[i];
data[i] = data[1];
data[1] = temp;

data.heapSize--;
max_heapify(data, 1);
}
}

int main()
{
DataType data;
data.push_back(0);
int temp = 0;
while (cin >> temp)
{
data.push_back(temp);
}

heap_sort(data);

for (vector<int>::iterator iter = data.begin(); iter != data.end(); iter++)
{
cout << *iter;
cout << " ";
}
getch();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: