本文原创,转载请注明出处(羅小亮博客)。如果本文如果有雷同观点,纯属巧合。如果有引述他人成果,必会给出处。
极大堆(排序后从小到大):是具有以下性质的完全二叉树,每个结点的值都大于等于左右结点的值
下面是使用极大堆的方式进行排序,使用极小堆的排序原理差不多。
#include <iostream>
using namespace std;
void HeapAdjust(int a[],int s,int n);
void HeapSort(int a[],int n);
void Swap(int a[],int i,int j);
int main()
{
int a[10]={-1,8,2,1,6,7,9,4,3};
HeapSort(a,10);
for(int i=1;i<10;++i)
cout << a[i];
cout << endl;
system("pause");
return 0;
}
void HeapSort(int a[],int n)
{
int i;
for(i=n/2;i>0;--i)
{
HeapAdjust(a,i,n);//把数组,和结点,和数组长度作为参数
}
for(i=n-1;i>1;--i)
{
Swap(a,1,i);
HeapAdjust(a,1,i-1);
}
}
void Swap(int a[],int i,int j)
{
int temp;
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
void HeapAdjust(int a[],int s,int n)
{
int i;
int temp = a[s];
for(i=2*s;i<=n;i*=2)
{
if(i<n && a[i]<a[i+1])
{
i++;
}
if(temp >= a[i])
break;
a[s]=a[i];
s=i;
}
a[s]=temp;
}