#include<iostream>
using namespace std;
void Adjust(int a[],int k, int n)
{
int i;
int temp = a[k]; //待判断的节点
for(i=2*k;i<=n;i*=2) //i*2 下一次循环时就会指向当前的左孩子节点
{
if (i < n && a[i] < a[i + 1]) //如果右孩子较大则让i指向右孩子
i++;
if (temp < a[i])
{
a[k] = a[i]; //将a[i]调整到双亲节点的位置上
//堆结构被破坏了 需要进行调整
k = i;
}
else
break; // 调整结束
}
a[k] = temp; //被调整节点的值放入最终的位置
}
void HeapSort(int a[],int n)
{
int i, temp;
for (i = n / 2; i >= 1; i--) //建立初始堆,从最后一个非叶子节点开始
Adjust(a,i, n);
for (i = n; i >= 2; --i) //进行n-1次循环完成堆排序
{//a[1]存放的是根节点中元素,为最大值,所以与放入最后的位置
temp = a[1];
a[1] = a[i];
a[i] = temp;
Adjust(a,1, i - 1); //在减少了1个元素的无序序列中进行调整
}
}
int main()
{
int a[9] = { -1,49,38,65,97,76,13,27,49 };//a[0]不存放值,以-1替代
HeapSort(a,8);
for (int i = 1; i < 9; i++)
cout << a[i] << ' ';
system("pause");
}
堆排序
最新推荐文章于 2016-08-08 19:14:38 发布