题目: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).