1.什么是中位数
给定一组数arr1 = [1,3,0,2,6](奇数的情况)求其中位数
对arr1根据数值大小重新排列:arr1_new = [0,1,2,3,6]
因此,arr1的中位数为2(2在中间位置)
给定一组数arr2 = [1,3,0,2,6,5](偶数的情况)
对arr2根据数值大小重新排列:arr2_new = [0,1,2,3,5,6]
因此,arr2的中位数为**(2+3)/2 = 2.5**(2和3为中间位置,取平均值)
2.代码实现:
一开始的想法:先对这三个数进行排序,再取去排序后的中间的数,即为中位数。
排序算法,在前面的博客中已经有了介绍,比如冒泡排序、快速排序等。
我们以冒泡排序为例:
python3代码:
# -*- coding: utf-8 -*-
"""
Created on Sun Jul 14 17:50:41 2019
@author: ZQQ
找三个数中的中位数
先冒泡排序,再取中间的数
"""
def getMid(input_list):
'''
函数说明:冒泡排序(升序)
Parameters:
input_list - 待排序的列表
Returns:
sorted_list - 升序排序后的列表
''' # 外循环,每次使得有序的数增加一个
for i in range(len(input_list) - 1): # 这个循环负责设置冒泡排序的次数,n个数要进行n-1次冒泡
for j in range(len(input_list) - i - 1): # j为列表下标
if input_list[j] > input_list[j + 1]:
input_list[j], input_list[j + 1] = input_list[j + 1], input_list[j]
return input_list[1]
input_list = [5,2,9]
print('三个数为:',input_list)
res = getMid(input_list)
print('中位数:',res)
运行结果:
上述方法不是最优解,我们对其进行优化。
在这里我们只有3个数,也就是取三个数中的中间数;
(0 , 1 , 2) # 索引
(A, B,C) # 抽象出来的未知数
(5 , 2 , 9) # 分别和A,B,C对应的具体值,作为具体例子
首先A和B进行比较,将两者较大的值放第一位,很显然这里5>2不需要改动,
然后,A和C进行比较,C如果大,则两者位置互换,此时变为:
(0 , 1 , 2)
(A, B,C)
(9 , 2 , 5)
A为9,B为2,C为5
最后,B和C进行比较,如果C大,则两者互换:
(0 , 1 , 2)
(A, B,C)
(9 , 5 , 2)
此时索引1位置的数5即为中位数,该两两比较的方法,也就是对这三个数降序排序。
python3代码实现:
# -*- coding: utf-8 -*-
"""
Created on Mon Jul 15 10:01:42 2019
@author: ZQQ
"""
def getMid(list):
if list[0] < list[1]:
list[0], list[1] = list[1], list[0]
if list[0] < list[2]:
list[0], list[2] = list[2], list[0]
if list[1] < list[2]:
list[1], list[2] = list[2], list[1]
return input_list[1]
input_list = [5,2,9]
print('三个数为:',input_list)
res = getMid(input_list)
print('中位数:',res)
运行结果:
C语言代码实现:
#include<stdio.h>
void main()
{
int a,b,c,temp;
scanf("%d%d%d",&a,&b,&c);
if ( a<b ) { temp=a;a=b;b=temp; }
if ( a<c ) { temp=a;a=c;c=temp; }
if ( b<c ) { temp=b;b=c;c=temp; }
printf("中位数是%d\n",b);
}
运行结果:
写该博客的启发来自牛客网上的一份面经,技术面的时候问了ta一个求三个数中位数的问题。大问题都是由小问题组合而成,应该注重细节问题,才能把问题解决好。
思考:求一组数的众数?