堆排序的实现.

题目:luogu1177.

题目就是让我们对一个序列从大到小排序.

给堆排序很简单,因为我们知道堆是可以O(1)取最大值最小值且支持O(log(n))插入删除的数据结构,所以我们可以先将原序列插入一个堆中,在不断取最小值删除节点.

这样子由于插入删除是O(log(n))的,且都是O(1)查询最值的,所以总的时间复杂度为O(nlog(n)).

而且用上STL内置堆就会特别好写,比快排好写,虽然常数大一些.

代码如下:

#include<bits/stdc++.h>
  using namespace std;
#define TLE priority_queue
TLE<int,vector<int>,greater<int> >q;
int x,n;
void into(){
  scanf("%d",&n);
  for (int i=1;i<=n;i++){
    scanf("%d",&x);
    q.push(x);
  }
}
void outo(){
  for (int i=1;i<=n;i++){
    printf("%d ",q.top());
    q.pop();
  }
  printf("\n");
}
int main(){
  into();
  outo();
  return 0;
}

这样就可以把快排模板题水过去了.

当然没有sort好用.

而且堆排序有一个优势,就是用上可并堆,可以O(log(n))合并.

而且快排是不稳定的,随便就可以把快排卡到O(n^2).

至于还可不可以再快一点,可以用斐波那契堆来将插入的时间复杂度变成O(1).

猜你喜欢

转载自blog.csdn.net/hzk_cpp/article/details/80665501