渣渣的我,终于调出来了,暴风哭泣
没有画图,只有程序,但是每一步都表示出来了,可以自己画图
参考http://www.cnblogs.com/MOBIN/p/5374217.html 图解更清楚
#include<iostream>
using namespace std;
void PercDown(int a[], int i, int N)
{//堆调整,下沉
int left, right, j;
while((left=2*i+1) < N)
{
j = left;
right = left + 1;
if (right < N&&a[left] < a[right])
j++;
if (a[i] < a[j])//子结点大于父结点,则交换父子结点
{
swap(a[i], a[j]);
i = j;
}
else
break;
}
}
void Heap_Sort(int a[], int N)
{//堆排序
int i,k,w;
for (i = N / 2 - 1; i >= 0; i--)
{
PercDown(a, i, N);
cout << "构建最大堆:" << endl;
for (k = 0; k < N; k++)
cout << a[k] << " ";
cout <<" for循环构建最大堆"<<endl;
}
for (w = N - 1; w > 0;w--)
{
swap(a[0], a[w]);
cout << "交换堆顶与堆末尾元素," ;
cout << "交换a[0] " << a[0] << "与a["<<w<<"] " << a[w] << endl;
cout << "交换之后的堆:" << endl;
for (i = 0; i < N; i++)
cout << a[i] << " ";
cout << endl;
PercDown(a, 0, w);
cout << "调整交换后的堆:" << endl;
for (i = 0; i < N; i++)
cout << a[i] << " ";
cout << endl;
}
}
void main()
{
int n;
cout << "输入n:" << endl;
cin >> n;
int *p = new int[n];
cout << "输入" << n << "个元素:" << endl;
int i,k;
for (i = 0; i < n; i++)
cin >> p[i];
Heap_Sort(p, n);
cout << "0---------------------------0" << endl;
cout << "排序后:" << endl;
for (k = 0; k < n; k++)
cout << p[k] << " ";
cout << endl;
delete[] p;
system("pause");
}
运行结果