社区讨论

关于“新”排序算法

学术版参与者 12已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
13 条
当前快照
1 份
快照标识符
@mivd69un
此快照首次捕获于
2025/12/07 14:51
2 个月前
此快照最后确认于
2025/12/10 13:21
2 个月前
查看原帖
rt。
就是我们对序列分块,内部用 sort,然后用堆进行合并,似乎时间复杂度是 O(nlogn)O(n \log \sqrt n) 的。
CPP
#include<cmath>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int N=1e5+10,M=200;
struct Node{
	int a,i;
	bool operator< (const Node l) const
	{
		return a>l.a;
	}	
};
priority_queue<Node>p;
int a[N],s[N]; 
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	int m=ceil(n*1.0/M);
	for(int i=1;i<=m;i++){
		int l=(i-1)*M+1,r=min(n,i*M);
		sort(a+l,a+r+1);
	}
	for(int i=1;i<=m;i++){
		s[i]=(i-1)*M+1;
		p.push({a[(i-1)*M+1],i});
	}
	for(int i=1;i<=n;i++){
		Node x=p.top();
		p.pop();
		cout<<x.a<<' ';
		if(s[x.i]+1<=min(n,x.i*M)){
			s[x.i]++;
			p.push({a[s[x.i]],x.i});
		}	
	}
	return 0;
}
  1. 是否是正确的?
  2. 时间复杂度是否是正确的?
  3. 有什么用?
  4. 还有什么复杂度或常数优化吗?

回复

13 条回复,欢迎继续交流。

正在加载回复...