堆排序
2017-07-11 20:46
190 查看
#include <iostream> #include <queue> #include <algorithm> using namespace std; int n,h[100]; void siftdown(int i) { int flag = 0,t; while(i*2 <= n &&flag == 0) { if(h[i] < h[i*2]) t = i*2; else t = i; if(i*2+1 <= n) { if(h[i] < h[i*2+1]) t = i*2+1; } if(t != i) { swap(h[i],h[t]); i = t; } else flag = 1; } return; } void creat() { int i; for(i = n/2;i >= 1;i--) { siftdown(i); } } void heapsort() { while(n>1) { swap(h[1],h ); n--; siftdown(1); } } int main() { int num; cin >> num; n = num; for(int i = 1;i <= num;i++) cin >> h[i]; creat(); heapsort(); for(int i = 1;i <= num;i++) cout << h[i] << " "; return 0; } 若是实现从小到大排序,需要建立最大堆,那么堆首为最大值,将堆首h[1]和h 交换,那么堆首就是最小值,堆尾就是 最大值,将n--,就排好了最大值,依次往前这样判断,直到n等于1,即只有一个元素。 另外堆还能用来求一个数列中的第k大的数,需要建立一个大小为k的最小堆,堆首即为最小值,从第k+1个数开始,若 这个数比堆首还要小,这个数就不要,否则的话,就将这个数替换堆首元素,然后去维护最小堆,用同样的方法判断 完成所有的数。即h【k】就是第k大的数 求第k小的数的时候也一样,但是需要建立一个大小为k的最大堆,............