算法 - 乞讨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,请你在该数组中找出和为目 ...
随机推荐
- Redis集群明细文档(转)
相信很多用过Redis的同学都知道,Redis目前版本是没有提供集群功能的,只能单打独斗.如果要实现多台Redis同时提供服务只能通过客户端自身去实现.目前根据文档已经看到Redis正在开发集群功能, ...
- zoj1610(线段树)
题目连接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 题意:在0-8000长的线段里面,按先后次序依次覆盖颜色, ...
- 用XAML做网页!!—边栏与页脚
原文:用XAML做网页!!-边栏与页脚 此次我们来设计边栏和页脚,首先从页脚开始,其代码很简单: <Border x:Name="Footer" BorderBrush=&q ...
- JS中 document.getElementById 对象
Document 对象 每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问. 提示:Document 对 ...
- Windows Phone开发(7):当好总舵主
原文:Windows Phone开发(7):当好总舵主 吹完了页面有关的话题,今天我们来聊一下页面之间是如何导航的,在更多情况下,我们的应用程序不会只有一个页面的,应该会有N个,就像我们做桌面应 用开 ...
- 经典排序算法 - 高速排序Quick sort
经典排序算法 - 高速排序Quick sort 原理,通过一趟扫描将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整 ...
- 在MyEclipse8.5中配置Tomcat6.0服务器
一.单击工具栏的的黑小三角,选择—>Configure Server,出现首选项对话框,在对话框的左边框中找到MyEclipse—>Application Servers下找到Tomcat ...
- cocos2d-x学习过程中的疑问
1.一个Scene中不同的层或者有几层Layer是在什么时候设置的? 2.helloWord中init()函数是有谁来调用的? 答:HelloWorld的init函数是在create函数调用后才会调用 ...
- 升级到cocos2d-x 2.0.2代码差异
来自:http://www.cnblogs.com/TopWin/archive/2012/09/12/2682042.html 近期看cocos2d-x 2.0.2公布后升级了一下.升级后发现又出现 ...
- javascript 的bind/apply/call性能
javascript有两种使用频率非常高的三个内置的功能:bind/apply/call.许多技术是基于高点,这些功能实现.这三个功能被用来改变的功能运行环境.从而达到代码复用的目的. 先来所说bin ...