解题思路:
这是一种分治思维,现将所排序选择的数字定位,再将左右两边的数用递归的方式再度进行这样的排序,此排序的时间复杂度为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分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论