**堆排序是时间复杂的为 nlog(n)的算法,性能较好,不用开辟新的空间,值得我们好好学习。
**
#include<iostream>
using namespace std;
template<class T>
void PercolateDown(T* a,int pos,int size)
{
int p=pos;
T temp=a[p];
int c=2*p+1;
while(c<size)
{
if((c+1)<size&&a[c+1]>a[c])
{
c+=1;
}
if(a[c]>temp)
{
a[p]=a[c];
p=c;
c=2*p+1;
}
else
{
break;
}
}
a[p]=temp;
}
template<class T>
void BulidHeap(T* a,int size)
{
for(int i=(size/2)-1;i>=0;i--)
PercolateDown(a,i,size);
}
template<class T>
void HeapSort(T* a,int size)
{
BulidHeap(a,size);
T temp;
for(int i=size-1;i>0;i--)
{
temp=a[i];
a[i]=a[0];
a[0]=temp;
PercolateDown(a,0,i);
}
}
int main()
{
int array[]={1,23,90,3,3,3,56,78,0,7,13,56,99,78};
for(int i=0;i<14;i++)
{
cout<<array[i]<<"\t";
}
cout<<"\n";
HeapSort(array,14);
for(int i=0;i<14;i++)
{
cout<<array[i]<<"\t";
}
return 0;
}
输入数组:1,23,90,3,3,3,56,78,0,7,13,56,99,78
下图展示排序后的结果