#include<iostream>
using namespace std;
void duisort(int a[],int parent,int lenth)
{
int temp = a[parent]; //取父节点的值
int child = parent * 2 + 1; //取第一个子节点,这里默认取左边值
while (child<lenth)
{
if (a[child] < a[child + 1]) //如果右边的数更大,取右边的数
{
child++;
}
if (a[child] < temp) //如果父节点最大,直接退出循环
{
break;
}
a[parent] = a[child]; //说明子节点比父节点大,将子节点的值赋给父节点,同时父节点的值保存在temp中不会丢失
parent = child; //继续遍历下面的节点,找到适合父节点的位置
child = child * 2 + 1;
}
a[parent] = temp; //最后将找到的适合父节点的位置给父节点,这个时候说明他的后面已经形成了最大堆
}
int main()
{
int n;
cin >> n;
int a[50];
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
for (int i = n / 2 - 1; i >= 0; i--) //这里的作用是形成最大堆,从最后一个有孩子的子节点开始,向前遍历,这样可以保证生成最大堆
{
duisort(a, i, n);
}
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
for (int i = n-1; i >0;) //这个时候a[0]已经是堆中最大的数,所以将其交换,同时再一次的进行堆运算,由于已经生成了最大堆,所以这个时候可以保证能够一次生成最大堆
{
int temp = a[0];
a[0] = a[i];
a[i--] = temp; //交换两个数的位置
duisort(a, 0, i); //这里在进行最大堆的运算
}
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
堆排序
最新推荐文章于 2020-08-07 13:24:30 发布