代码实现求三个数中的中位数

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一个求三个数中位数的问题。大问题都是由小问题组合而成,应该注重细节问题,才能把问题解决好。

思考:求一组数的众数?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1、设计要基于小脚丫FPGA开发板和四位数码管实现数字时钟的设计,要: 1)采用FPGA+按键+四位数码管实现数字时钟功能; 2)时间显示格式:XX:XX:XX (时:分:秒),采用24小时制; 3)四位数码管显示时分秒,可以通过按键控制选择显示时分界面还是分秒界面。 4)通过按键设定初始时间。 5)设置在整点12点时,通过蜂鸣器响示意整点报时。蜂鸣器响维持大概5S; 2、硬件连接FPGA的系统时钟来自于小脚丫FPGA开发板配置的24MHz时钟晶振,连接FPGA的C1引脚。 本设计用到五个个按键K1~K5,硬件设计如图1所示,五个按键分别连接到FPGA的B8、C8、A10、A11和A12引脚。 图1. 按键硬件设计 本设计用到一个蜂鸣器来示意整点报时,硬件设计如图1所示,蜂鸣器连接到FPGA的B2引脚。 图2. 蜂鸣器硬件设计 本设计用到四位数码管来显示时间,四位数码管用两个74HC595驱动,硬件设计如图1所示,74HC595的串行时钟SCK、并行时钟RCK和串行数据DIN分别连接到FPGA的N2、M1和K1引脚上。 图3. 数码管驱动74HC595硬件设计 3、工作原理1)使用计数器做分频处理,得到周期为1秒的脉冲信号; 2)使用三个8bit的BCD码表示时钟、分钟、秒钟的值,其中高4bit表示值的十位,低4bit表示值的个位; 3)正常运行时,每来一个1S脉冲信号个位加1,个位满10清零同时十位加1,当秒钟满60清零同时分钟个位加1,依次进行...直到23:59:59的下一刻全部清零; 4)按键K5,模式调节,设计共分4中模式(分秒显示、分秒调节、时分显示、时分调节),按动K5依次切换模式; 5)按键K2,时间调节,当数字时钟在时针调节、分针调节或秒针调节模式时,按动K2调节对应时间位; 6)在调时分和调分秒两个状态,可以通过K4和K2键分别左移右移要调整的位,要调整的位会通过对应位的闪烁来示意。通过K4和 K2左右移动选择好要调整的位以后,就可以通过K1和K3来增大或调小对应的位; 4、代码设计为了实现所需要的功能,我们将整个设计划分不同的模块,如图4所示。 图4. 数字时钟程序设计框架 4.1五位按键消抖模块 图5. 五位按键消抖模块 Ø输入:五位的按键电平信息输入 Ø输出:五位消抖后的脉冲输出 Ø功能:将按键按下一次的电平信号,经过消抖后变成一个维持一个时钟周期的脉冲信号; Ø原理: 图6. 按键抖动特性 FPGA过20ms检测按键是否按下,存储检测到的值,并且按位取反与前一个20ms检测的值相与,得到一个值,如果为1,则判断按键按下,否则则无按下。 图7. FPGA按键的理解示意图 4.2电子表显示控制模块。 图8. 电子表显示控制模块 Ø输入:五位的按键脉冲 Ø输出:十六位的BCD码输出,每四个代表一个十进制数; Ø原理:四位的位闪烁控制信号。某一位为一代表这位对应的数码管的一位进行闪烁显示。(在调整状态下,会让当前调整的哪一位进行闪烁。正常显示状态下seg_flash_data全为零); Ø功能:主要就是一个状态机,通过检查输入的按键信息,进行显示状态切换,时间调整。四个状态分别为:显示分秒,调分秒,时分显示,调时分;当K5按键按下(key_pulse[4])时依次跳转,如图9所示。 图 9. 数字时钟状态控制设计 4.3数码管译码模块 图10. 数码管译码模块 Ø输入:四位的BCD码数据 Ø输出:八位的七段数码数据 Ø功能:一个case语句,将输入的四位BCD码转化为七段数码数据; Ø原理:数码管分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳极(COM)需接+5V才能使其工作。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码,共阴极(COM)需接GND才能使其工作。小脚丫拓展板上的数码管如下图所示: 图11. 数码管内部电路 共阴极数码管: 位选为低电平(即0)选中数码管;各段选为高电平(即接+5V时)选中各数码段;由0到f的编码为: 4.4四位数码管显示控制模块。 图12. 数码管显示控制模块 Ø输入:四个八位的七段数码管数据和位闪烁控制信号seg_flash_data. Ø输出:需要串行输出给74HC595的十六位数据; Ø功能:模块就是循环的将四位七段数码数据,组合一个十六位的输出数据; 4.5 74HC595驱动功能模块 图13. 74HC595驱动功能模块 Ø输入:十六位的位选段选数据。 1)duan_wei_data[13:0]分别对应: 2)[ X,X,H+,H-,DIG4,DIG3,DIG2,DIG1,DP,G,F,E,D,C,B,A] ; Ø输出:SPI接口输出,串行输出十六位位选段选信号; Ø

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器不学习我学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值