学习数据结构整整一年了,感觉排序很重要,尽管很多时候直接调用标准库sort函数进行快速排序很方便,但是经典的排序算法却很有味道。现在谈谈堆排序。
堆排序是基于数组支持快速随机访问元素的,在其他线性数据结构下堆排序不一定有优势。关于小顶堆、大顶堆的概念在此就不多说了。堆排序是一种选择排序法,不过直接选择排序每次在选择最小值或最大值时要进行时间复杂度为O(n)的比较,而堆排序可以利用小顶堆或大顶堆在时间复杂度为O(log(n))时完成该工作。堆排序要基于小顶堆或大顶堆,并且在排序的过程中要实时更新。下面贴出代码:
#include<iostream>
using namespace std;
template<typename T>
void CreatHeap(T *ptr,int id,int n)
{
int j=2*id+1,tmpRoot=id;
T t;
while(j<n)
{
if(j<n-1&&ptr[j]<ptr[j+1])
j+=1;
if(ptr[tmpRoot]<ptr[j])
{
t=ptr[tmpRoot];
ptr[tmpRoot]=ptr[j];
ptr[j]=t;
tmpRoot=j;
j=2*j+1;
}
else break;
}
}
template<typename T>
void InitHeap(T *ptr,int n)
{
for(int i=(n-2)/2;i>=0;i--)
CreatHeap(ptr,i,n);
}
template<typename T>
void HeapSort(T *ptr,int n)
{
InitHeap(ptr,n);
for(int i=n-1;i>0;i--)
{
int tmp=ptr[i];
ptr[i]=ptr[0];
ptr[0]=tmp;
CreatHeap(ptr,0,i);
}
}
int main()
{
const int MAXN=8;
int array[MAXN]={10,50,32,5,76,9,40,88};
HeapSort(array,8);
for(int i=0;i<8;i++)
cout<<array[i]<<" ";
cout<<endl;
system("pause");
return 0;
}
算法总的时间复杂度为O(n*log(n))较之直接选择排序有质的提高。