您的位置:首页 > 其它

最大堆实现堆排序

2017-09-13 00:36 232 查看
堆排序(这里使用的是最大堆)

思想:1、将当前的堆转换成最大堆(从最大的非叶子结点开始,(1)判断根结点和左右结点的大小交换相互的位置,
使得该子树成为最大堆,每次交换成功后就继续往该结点的子结点去重复(1)操作,直到根结点后再去下一个非叶子结点,直到根结点)
2、转成最大堆后,每次就将第一个结点互最后一个结点进行交换,然后将整个堆的长度减去1
(因为最后一个结点就是整个数组中最大的元素,即就是已经排序好的结点)

3、重复1、2的操作,直到堆中的元素都排序好了

代码如下:

#include <iostream>
using namespace std;
int data[] = { 50, 10, 90, 30, 70, 40, 80, 60, 20 };//测试示例
void ChangeMaxHead(int len)
{
//len/2代表最大的非叶子结点
for (int i = len / 2; i >= 1; i--){
int temp = i;
int maxIndex = temp;
while (true)
{
int LeftIndex = 2 * temp;
int RightIndex = 2 * temp + 1;
if (LeftIndex > len) break;//左结点不存在,意味着该结点是叶子结点
if (LeftIndex <= len && data[LeftIndex - 1] > data[maxIndex - 1]){//左结点存在并且值大于根结点
maxIndex = LeftIndex;
}
if (RightIndex <= len && data[RightIndex - 1] > data[maxIndex - 1]){//右结点存在并且值大于根结点
maxIndex = RightIndex;
}
if (maxIndex != temp){//交换两个结点
int swapV = data[temp - 1];
data[temp - 1] = data[maxIndex - 1];
data[maxIndex - 1] = swapV;
temp = maxIndex;
}
else break;
}

}
}
void Head_Sort(int len)
{
ChangeMaxHead(len);
for (int i = len - 1; i > 0; i--)
{
int temp = data[0];
data[0] = data[i];
data[i] = temp;
ChangeMaxHead(i);
}
}

int main()
{
Head_Sort(9);
for (int i = 0; i < 9; i++)
{
printf("%d ", data[i]);
}
puts("");
return 0;
}
//输出 10 20 30 40 50 60 70 80 90
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: