桂林学院-第十四届蓝桥杯大赛校级预选赛-第一轮-编程题-PTA 7-3 中位数几何-C/C++题解

目录

题目

参赛与思考经历

代码


       作者是大四软件工程专业的学生,在校备考研,听闻有蓝桥杯选拔赛就去试试水,万一选上了学院就给报销报名费,然后就去划个水哈哈哈。

      挑了中位数几何这道编程题来讲。(主要思路:选择排序)

题目

7-3 中位数几何

分数 12

作者 龚雄兴

单位 湖北文理学院

N个整数的中位数是指这N个整数排序后中间的那个数(即小于它和大于它的数的数量相等),如果个数为奇数,排序后中间的那个数即为中位数,并约定:如果N为偶数,则取排序后正中间的两个数的平均值(取整数)。编写程序,输出给定整数数组的前1个,前2个,……前N个的中位数(以空格分隔)。

输入格式:

第一行是整数的个数N(正整数)、第二行是空格间隔的N个整数。

输出格式:

花括号中的N个整数,以逗号分隔,依次是前一个,前两个,……前N个数的中位数(整数)。

输入样例:

6
-20 30 -10 10 40 -40

输出样例:

{-20,5,-10,0,10,0}

代码长度限制

16 KB

时间限制

40 ms

内存限制

64 MB

参赛与思考经历

      当时在机房用了快排的写法只过了一大半案例。实在想不出怎么优化就放弃了。之后几天看这道题思考如何降低时间复杂度。原先写法是一个循环套sort()函数,时间复杂度n*nlogn=n^2logn,按理说快排已经算是排序算法中时间复杂度很低了,很难优化。

      除非,没有必要无脑用快排。仔细研究题目,题目要求每一次都要输出前N个的中位数,即每次都需要对前N个数排序以便找出中位数。很多人(包括我)一下想到的思路就是用快排进行排序,但是其实并不需要用上快排。

       因为每一次循环都需要有序的前N个数。即第N次循环时需要有序的前N个数,而上一次循环已经对前N-1个数排序好了,而这第N个数这一个数只需插入排序(遍历一次)就可以排序完成。对于这种情况来说,插入排序要比快速排序更好。

      简单写了下插入排序的函数,过了!

代码

c和c++的代码差不多,就不放c的代码了

#include<bits/stdc++.h>
using namespace std;
//插入排序 
void insert_sort(int a[],int n)
{
	int j; 
    for(int i=1;i<n;i++){
        int temp=a[i];
        for(j=i-1;j>=0&&a[j]>temp;j--){
            a[j+1]=a[j];
        }
        a[j+1]=temp;
    }
}
int main()
{
	int n;
	cin>>n;
	int a[n];
	int b[n];
	for(int i=0;i<n;i++){
		cin>>a[i];
	}

	for(int i=0;i<n;i++){
//		插入排序
		insert_sort(a,i+1);
//		计算中位数 
		if(i%2==1){
			b[i]=(a[(i-1)/2]+a[(i+1)/2])/2;
		}else{
			b[i]=a[i/2];
		}
	}
	
	cout<<"{";
	for(int i=0;i<n;i++){
		cout<<b[i];
		if(i!=n-1){
			cout<<",";
		}
	}
	cout<<"}";
	return 0;	
} 

稍后会在bilibili平台上传题解讲解视频

猜你喜欢

转载自blog.csdn.net/weixin_45940369/article/details/127989330