时间复杂度为O(NlogN)的排序算法有很多。
其中归并算法虽然时间短,但是需要的内存空间很大,因为其不断递归调用自身;而快速排序算法虽然平均情况下所花费时间也很短,但是在极端情况下,其时间复杂度为O(N²)。而堆排序呢,则是综合了这两者的优点,去除了这两者的缺点,所需要的内存空间不大,而且不管在什么情况下,其时间复杂度都为O(NlogN)。
而堆排序也是一种用到数据结构知识的排序算法,可见,数据结构这门课是非常重要的。
#include<iostream>
using namespace std;
void HeapAdjust(int *Array,int location,int size)
{
int lChild = location * 2 + 1;
int rChild = location * 2 + 2;
int max = location;
if(location <= size/2)
{
if(lChild<=size&&Array[lChild]>Array[max])
{
max = lChild;
}
if(rChild<=size&&Array[rChild]>Array[max])
{
max = rChild;
}
if(max!=location)
{
int temp = Array[location];
Array[location] = Array[max];
Array[max] = temp;
HeapAdjust(Array, max, size);
}
}
}
void BuildHeap(int *Array,int size)
{
int i;
for(int i=size/2;i>=0;i--)
{
HeapAdjust(Array,i,size);
}
}
void HeapSort(int *Array,int size)
{
int i;
BuildHeap(Array,size);
for(i=size-1;i>=0;i--)
{
int temp = Array[0];
Array[0] = Array[i];
Array[i] = temp;
HeapAdjust(Array,0,i-1);
}
}
int main()
{
int a[100],size;
while(scanf("%d",&size)==1&&size>0)
{
for(int i=0;i<size;i++)
{
cin>>a[i];
}
HeapSort(a,size);
for(int i=0;i<size;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
return 0;
}