算法 - 乞讨n中位数(C++)
//****************************************************************************************************
//
// 求n个数的中位数 - C++ - by Chimomo
//
// 对于一组有限个数的数据来说,它们的中位数是这种一种数:这群数据里的一半的数据比它大,而另外一半数据比它小。
// 计算有限个数的数据的中位数的方法是:把全部的同类数据依照大小的顺序排列。 假设数据的个数是奇数,则中间那个数据就是这群数据的中位数;假设数据的个数是偶数,则中间那2个数据的算术平均值就是这群数据的中位数。 //
//**************************************************************************************************** #include <iostream>
#include <cassert>
#include <stack>
#include <math.h> using namespace std ; int QuickSortOnce(int a[], int low, int high)
{
// 将首元素作为枢轴。
int pivot = a[low];
int i = low, j = high; while (i < j)
{
// 从右到左,寻找首个小于pivot的元素。 while (a[j] >= pivot && i < j)
{
j--;
} // 运行到此,j已指向从右端起首个小于或等于pivot的元素。 // 运行替换。
a[i] = a[j]; // 从左到右。寻找首个大于pivot的元素。
while (a[i] <= pivot && i < j)
{
i++;
} // 运行到此。i已指向从左端起首个大于或等于pivot的元素。
// 运行替换。
a[j] = a[i];
} // 退出while循环,运行至此,必然是i=j的情况。
// i(或j)指向的即是枢轴的位置。定位该趟排序的枢轴并将该位置返回。 a[i] = pivot; return i;
} void QuickSort(int a[], int low, int high)
{
if (low >= high)
{
return;
} int pivot = QuickSortOnce(a, low, high); // 对枢轴的左端进行排序。
QuickSort(a, low, pivot - 1); // 对枢轴的右端进行排序。
QuickSort(a, pivot + 1, high);
} int EvaluateMedian(int a[], int n)
{
QuickSort(a, 0, n - 1); if(n % 2 !=0)
{
return a[n / 2];
}
else
{
return (a[n / 2] + a[n / 2 - 1]) / 2;
}
} int main()
{
int a[9] = {-5, 345, 88, 203, 554, 1, 89, 909, 1001};
cout << EvaluateMedian(a, 9) << endl; return 0;
} // Output:
/*
203
*/
版权声明:本文博客原创文章,博客,未经同意,不得转载。
算法 - 乞讨n中位数(C++)的更多相关文章
- 查找第K小的数 BFPRT算法
出处 http://blog.csdn.net/adong76/article/details/10071297 BFPRT算法是解决从n个数中选择第k大或第k小的数这个经典问题的著名算法,但很多人并 ...
- 快速排序以及第k小元素的线性选择算法
简要介绍下快速排序的思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此 ...
- 算法搬运之BFPRT算法
原文连接:http://noalgo.info/466.html BFPRT算法,又称为中位数的中位数算法,由5位大牛(Blum . Floyd . Pratt . Rivest . Tarjan)提 ...
- [算法]找到无序数组中最小的K个数
题目: 给定一个无序的整型数组arr,找到其中最小的k个数. 方法一: 将数组排序,排序后的数组的前k个数就是最小的k个数. 时间复杂度:O(nlogn) 方法二: 时间复杂度:O(nlogk) 维护 ...
- BFPRT算法(求第K小的数字)
BFPRT算法: 1.介绍: BFPRT算法又叫中位数的中位数算法,主要用于在无序数组中寻找第K大或第K小的数,它的最坏时间复杂度为O(n),它是由Blum,Floyd,Pratt,Rivest,Ta ...
- 5.查找最小的k个元素(数组)
题目: 输入n个整数,输出其中最小的k个,例如输入1,2,3,4,5,6,7,8这8个数,则最小的4个是1,2,3,4(输出不要求有序) 解: 利用快速排序的partition,算导上求第k大数的思想 ...
- Lettcode Kth Largest Element in an Array
Lettcode Kth Largest Element in an Array 题意:在无序数组中,寻找第k大的数字,注意这里考虑是重复的. 一直只会简单的O(nlogn)的做法,听说这题有O(n) ...
- LeetCode Day 2
LeetCode0004 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 n ...
- LeetCode Day 1
目录 1.TwoSum 2.AddTwoNumbers 4.FindMedianSortedArrays 1.TwoSum 给定一个整数数组nums和一个目标值 target,请你在该数组中找出和为目 ...
随机推荐
- H3C S5120交换机ACL应用的问题
下午在S5120上ACL的时候发现不起作用,ACL如下: acl number 3001 name deny-wan-to-lan-vpn rule 0 deny ip source 10.3.0.0 ...
- Cocos2d-x3.0 Button
Size widgetSize = Director::getInstance()->getWinSize(); Text* alert = Text::create("Layout& ...
- Failed to load libGL.so问题解决
Ubuntu 14.04下启动模拟设备Android 4.2.2的时候报错: failed to load libgl.so 先用locate 命令定位libGL库, 然后加入�一个链接就可以: de ...
- WPF界面设计技巧(8)—自制山寨版CheckListBox
原文:WPF界面设计技巧(8)-自制山寨版CheckListBox 近年来IT市场山寨横行啊,我们今天也来发扬一下山寨精神,搞个自制的CheckListBox出来. 喏,CheckListBox 就是 ...
- Gradle 修改 Maven 仓库地址(转)
近来迁移了一些项目到Android Studio,采用Gradle构建确实比原来的Ant方便许多.但是编译时下载依赖的网速又着实令人蛋疼不已. 如果能切换到国内的Maven镜像仓库,如开源中国的Mav ...
- iOS_ScrollView的自己主动布局
ScrollView的自己主动布局稍显麻烦.但也是有规律可循, 下面就是仅竖向滑动的scrollView加入约束的固定做法 1.在控制器的view加入一个label.取名做anchor 2.给anch ...
- Android开发中验证码的生成
近期在做电商金融类的项目,验证码的生成方法不可缺少.先学习了一种.经过測试好用.从别处学习的代码,稍修改了一下可选择是否支持识别大写和小写.直接上代码. import android.app.Acti ...
- Three.js 3D打印数据模型文件(.STL)载入中
3DPrint是现在和未来10年度科技产品的主流之中.广泛的. 对于电子商务类3D打印网站.一个主要功能就是商品3D呈现的方式,那是,3D数据可视化技术. HTML5(WebGL)它可以用于构建3D查 ...
- atitit.报告最佳实践oae 和报告引擎的选择
atitit.报告最佳实践oae 与报表引擎选型 1. 报表的基本的功能and结构 2 1.1. 查询设计器(配置化,metadata in html) ,anno 2 1.2. 查询引擎 2 1.3 ...
- Hadoop学习笔记(两)设置单节点集群
本文描写叙述怎样设置一个单一节点的 Hadoop 安装.以便您能够高速运行简单的操作,使用 Hadoop MapReduce 和 Hadoop 分布式文件系统 (HDFS). 參考官方文档:Hadoo ...