关于此题目的排序问题
查看原帖
关于此题目的排序问题
498102
lefy楼主2021/10/28 20:33

问一下这个从前往后扫和从后往前扫一遍n的复杂度,就可以完成n²的冒泡排序吗?有没有大佬可以解释一下!!

#include<bits/stdc++.h>
using namespace std;
struct node{
	int id,dt;
}a[8100];
int b[8100];
int cmp(node x,node y){
	if(x.dt!=y.dt)return x.dt<y.dt;
	return x.id<y.id;
}
int main(){
	int n,Q;
	scanf("%d%d",&n,&Q);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i].dt);
		a[i].id=i; 
	}
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++){
		b[a[i].id]=i;
	}
	while(Q--){
		int flag;
		scanf("%d",&flag);
		if(flag==2){
			int x;
			scanf("%d",&x);
			printf("%d\n",b[x]);
		}else{
			int x,y;
			scanf("%d%d",&x,&y);
			a[b[x]].dt=y;
			for(int i=2;i<=n;i++){
				if(a[i].dt<a[i-1].dt)swap(a[i],a[i-1]);
				if(a[i].dt==a[i-1].dt){
					if(a[i].id<a[i-1].id)swap(a[i],a[i-1]);
				}
			}
			for(int i=n-1;i>=1;i--){
				if(a[i].dt>a[i+1].dt)swap(a[i],a[i+1]);
				if(a[i].dt==a[i+1].dt){
					if(a[i].id>a[i+1].id)swap(a[i],a[i+1]);
				}
			}
			for(int i=1;i<=n;i++){
				b[a[i].id]=i;
			}
		}
	}
	return 0;
}

就是中间else里面的两个循环排序,可以说一下是为什么嘛! 为什么这样就可以保证是排好序的了

2021/10/28 20:33
加载中...