UDP广播协议叫吃饭


私信TA

用户名:Mustenaka

访问量:136286

签 名:

个人博客www.mustenaka.cn

等  级
排  名 12
经  验 23888
参赛次数 8
文章发表 197
年  龄 3
在职情况 学生
学  校 Sky_box
专  业 NE

  自我简介:

欢迎光临我的博客www.mustenaka.cn,Python,C#,U3D,C/C++开发合作可以找我

解题思路:
这是一种分治思维,现将所排序选择的数字定位,再将左右两边的数用递归的方式再度进行这样的排序,此排序的时间复杂度为O(NlogN)
注意事项:

参考代码:

(请不要直接抄袭)

#include<bits/stdc++.h>
#define maxn 10005
using namespace std;
int a[maxn],f[maxn];
void merge(int a[],int l,int m,int r) {
	int i=l,j=m;
	int p=l;
	while(i<m&&j<r) {
		if(a[i]<a[j]) {
			f[p++]=a[i++];
		} else {
			f[p++]=a[j++];
		}
	}
	while(i<m) {
		f[p++]=a[i++];
	}
	while(j<r) {
		f[p++]=a[j++];
	}
	for(int i=l; i<r; i++) {
		a[i]=f[i];
	}
}

void mysort(int a[],int l,int r) {
	if(l+1<r) {
		int m=(l+r)/2;
		mysort(a,l,m);
		mysort(a,m,r);
		merge(a,l,m,r);
	}
}

int main() {
	int n;
	while(scanf("%d",&n)!=EOF) {
		for(int i=0; i<n; i++)
			cin>>a[i];
			
		srand(time(NULL));	//乱搞数据
		for(int i=0; i<n/2; i++) {
			swap(a[i],a[rand()%n]);
		}
		
		mysort(a,0,n);
		for(int i=0; i<n; i++) {
			printf("%d ",a[i]);
		}
		cout<<endl;
	}
	return 0;
}

想到了一个毒瘤数据:

如果本身排序的数组就是逆序排序好了的,那么我们进行这样的排序将采用最坏情况,即时间复杂度高达O(n^2)的情况,这显然是容易在竞赛中GG的,所以为了避免毒瘤数据的出现。

我才用了随机数种子的方法把数据乱搞一通(打乱数组)这样就用了一种非常虚伪的方式实现了本排序算法时间复杂度趋向于O(n log n)的情况。

 

0.0分

0 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区