时间复杂度为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; }