堆排序
2012-05-01 20:26
267 查看
算法分类:
数据结构算法原理:
对于非降序排列而言:(升序同理)利用最大最小堆的性质,每次对数组生成最大堆后即将根节点放置到数组末尾,并对剩余数组继续生成最大堆。
算法时间复杂度:
时间复杂度:O(nlogn)空间复杂度:O(1)
代码实现:hdu1040
#include <iostream> using namespace std; int data[1005]; void siftDown(int index, int n) { int k = index; while (k*2 <= n) { k *= 2; if (k < n && data[k+1] > data[k]) { ++ k; } if (data[k/2] < data[k]) { swap(data[k/2],data[k]); } else { break; } } }; void makeHeap(int n) { for (int i = n/2; i > 0; -- i) siftDown(i, n); }; void heapSort(int n) { makeHeap( n); for (int i = n; i > 0; -- i) { swap(data[1], data[i]); siftDown(1, i-1); } }; int main() { int T, n; scanf("%d",&T); while (T --) { scanf("%d",&n); for (int i = 1; i <= n; ++ i) { scanf("%d",&data[i]); } heapSort( n); for (int i = 1; i < n; ++ i) { printf("%d ",data[i]); } printf("%d\n",data ); } }