寻找5个数的中位数,只需6次比较的,思路与实现

问题:寻找5个数的中位数,5个数中可能有相同的数,假设数依次存放在a[0] a[1] a[2] a[3] a[4]中,为了简便记为a0,a1,a2,a3,a4

思路:定义compare_swap(int* a,int* b)方法,此方法比较a,b两个数的大小,如果a大于b则交换两个数,也就是将两个数的较小者存放在a中,将较大者存放在b中。按照如下顺序进行比较:

比较a0 a1,将较小者存入a0

比较a2 a3,将较小者存入a2

比较a0 a2,将较小者存入a0,如果a0和a2发生了交换,则同时交换a1,a3,目的是使a0,a1和a2,a3仍保持原来的大小关系。进行这三次比较后,a0比a1,a2,a3都小,不可能是中位数,故排除a0,(5个数的中位数不可能比三个数都小)

比较a1 a4,将较小者存入a1

比较a1 a2,将较小者存入a1,如果a1和a2发生了交换,则同时交换a3,a4,使a1 a4和a2 a3的大小关系保持不变。进行这三次比较后,a1比a2,a3,a4都小,可以排除a1。

比较a2 a4,将较小者存入a2。这个时候a2就是中位数。

代码实现如下:

#include<stdio.h>

void compare_swap(int *a,int *b){//比较和交换方法
	if(*a>*b){
		int temp = *a;
		*a = *b;
		*b = temp;
	}
}

void swap(int *a,int *b){
	int temp = *a;
	*a = *b;
	*b = temp;
}

//寻找5个数的中位数,6次比较的方法
int find_median_in_five(int a[]){
	int temp;
	compare_swap(&a[0],&a[1]);
	compare_swap(&a[2],&a[3]);

	temp = a[0];
	compare_swap(&a[0],&a[2]);  //排除a[0]
	if(temp != a[0])
		swap(&a[1],&a[3]);

	compare_swap(&a[1],&a[4]);

	temp = a[1];
	compare_swap(&a[1],&a[2]);  //排除a[1]
	if(temp != a[1])
		swap(&a[3],&a[4]);

	compare_swap(&a[2],&a[4]);
	return a[2];
}

void main(){

	int a[] = {4,11,1,72,11};
	printf("%d\n",find_median_in_five(a));
}
时间: 2024-08-27 14:15:46

寻找5个数的中位数,只需6次比较的,思路与实现的相关文章

考题一:研究对全排列着色的性质 问题 A: 首先需要生成 n 的全排列然后对 n 的全排列进行着色, 使得相邻的两个数只需用最少颜色就可以把相邻的两个数用那区分开. (这里相邻包含两层含义:同时在自然

问题: (用C++实现)     **研究对全排列着色的性质. 首先需要生成n的全排列 然后对n的全排列进行着色, 使得相邻的两个数只需用最少颜色就可以把相邻的两个数用那区分开.  (这里相邻包含两层含义:同时在自然顺序和在当前排列的顺序中) 最后, 对着色的结果进行统计 结果需要 给定n,找出所有需要2种颜色的排列. 需要3种颜色的排列 需要4种颜色的排列 (已经证明最多只需要4色) (在第一问基础上)第二问: 需要找出需要4色的规律. 发现需要 4色的排列里面 有一些可以用以下个模型来表示(

对5个数进行排序,需7次比较的方法

本文介绍一个对5个数进行排序的方法,仅使用7次比较.假设要排序的数为a,b,c,d,e. 首先将a,b进行比较,假设结果为a<b,再将c,d进行比较,假设结果为c<d:然后将两组数的较大者进行比较(即比较b,d),假设结果为b<d,于是就有下面的关系,箭头的关系表示"<",即"小于",至此,已经进行了三次比较. ,这个图的含义为:a<b<d,c<d 现在将e插入到{a,b,d}的适当位置,采用二分查找法寻找查找位置时,只需要

Java是什么?只需5分钟,了解java必须要知道的知识点

不清楚Java是什么?只需5分钟,了解java必须要懂的知识点 Java吸取了C++面向对象的概念,将数据封装于类中,利用类的优点,实现了程序的简洁性和便于维护性.下面是我收集的Java必备基础知识点,希望对你有用. 1. 简述Java的基本历史 Java起源于SUN公司的一个GREEN的项目,其原先目的是:为家用消费电子产品发送一个信息的分布式代码系统,通过发送信息控制电视机.冰箱等. 2. Java特点 简单的.面向对象的.分布式的.安全的.稳定的.与平台无关的.可解释的.多线的.动态的语言

简单操作只需10秒破解PDF加密文件

简单操作只需10秒破解PDF加密文件 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51345950 如何破解PDF加密文件,如何破解PDF密码呢,破解加密的PDF文件? 从网上下载的PDF文件,由于版权的问题,作者经常会加密禁止读者复制修改等权限,如下面的PDF文档,用Adobe pdf Reader打开时,会显示"已加密"的字样,虽然可以阅读,但不能修改和标记. 为了解决这个问题,可以采用绕过破解密码这一

数据结构 - 只需选择排序(simple selection sort) 详细说明 和 代码(C++)

数据结构 - 只需选择排序(simple selection sort) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28601965 选择排序(selection sort) : 每一趟在n-i+1个记录中选取keyword最小的记录作为有序序列中第i个记录. 简单选择排序(simple selection sort) : 通过n-i次keyword之间的比較, 从n-i+1个记录中选出keyword最小的记录, 并和第i

如何做好一个 Product Owner? 其实只需懂得好好的 “爱” 自己

许多人都在探讨著一个问题:如何做好一个 Product Owner ? 有的人会搬出一大堆敏捷的书, 一大堆敏捷的实践来回答这个问题.事实上, 这些书.实践都是多余的, 甚至可以说都是些废话. 其实, 大家只需向 Steve Jobs 学习, 便足矣. 因为, Steve Jobs 是这世上最成功的 Product Owner. Steve Jobs 具备了以下的特质, 使他成为这世上最成功的 Product Owner: Steve Jobs 懂得好好的 "爱" 自己.而不是被世俗价

算法 - 求n个数的中位数(C++)

placeholder算法 - 求n个数的中位数(C++),布布扣,bubuko.com

设置交互要多久?最快只需三秒!

原型设计分为两种,一种是静态的线框图,我们一般叫wireframing:另一种是动态的原型,一般叫作prototyping.目前在prototyping设计中涉及到的交互主要分为三种:页链接.交互状态和组件之间的交互.而动态原型的设计工具中比较常见的能够包括这三种交互设置功能的也有很多,比如:Axure.Justinmind.Mockplus和Proto.io等等,种类之多,数不胜数.但是,这些工具无一例外,都在宣传自己的过程中说自己是快捷迅速的.我们平时说的Axure,全名叫做Axure RP

在Unity 5.2中,只需几步即可轻松使用Unity服务!

孙广东  2015.9.14 转载自官方: 上周我们发布了Unity 5.2,通向Unity服务的大门已为您敞开!在编辑器内轻松使用Unity Ads, Unity Analytics,Unity Cloud Build 和 Unity Multipalyer, 从此告别SDK!就是这么简单,只需几步! 1 打开服务窗口 在窗口菜单点击Unity Service,或者点击右上角的"Cloud"图标. 2 创建项目ID 下面就开始创建您的项目Project ID了,请注意:Project