查找中位数是面试中经常出现的一类题。用快速排序的思想可以解决这种问题,算法如下:
1.抽取数组的第一个元素作为中间值,用快速排序的思想进行一次调整,将比中间值小的放在中间值的左边,比中间值大的放在中间值的右边。
2.如果中间值的索引等于数组长度的一半,那么就找到了。
3.如果中位数的索引比数组长度的一半大的话,那么在中间值的索引到数组的结尾这个期间内找第(数组长度的一半-中位数)大的数。
4.否则在数组的开始到中间值的索引这段期间内找第(数组长度的一半大)大的数。递归的调用上面的几步,就可以解决问题了!
/*
*开 发 者:卡农
*开发时间:2010-10-6
*描 述:查找中位数 , 算法的实现其实是快速排序的变种
#include<iostream>
using namespace std;
/*
*查找array数组里面array[left-right]第Max大的
*参数:array 存储数据的数组
* left 数组的左界
* right 数组的右界
* Max 查找的第Max大
*/
void _f(int array[] , int left , int right , int Max){
if(left>right){
cout<<array[left+Max]<<endl;
return;
}
int middle=array[left];
int _left=left;
int _right=right;
while(_left<_right){
while((_left<_right)&&(array[_right]>=middle)){
_right--;
}
array[_left]=array[_right];
while((_left<_right)&&(array[_left]<=middle)){
_left++;
}
array[_right]=array[_left];
}
if((_left-left)==Max){
cout<<array[_left]<<endl;
exit(0);
}
if((_left-left)<Max){
_f(array , _left+1 , right , Max-(_left-left)-1);
}else{
_f(array , left , _left-1 , Max);
}
}
/*
*查找中位数
*参数: array 存储数据的数组
* length 数组的长度
*/
void f(int array[] , int length){
_f(array , 0 , length-1 , length/2);
}
/*
*测试用例
*/
void main(){
int data[]={1,2,3,4,2,1,1,2,5,3,11};
f(data , 11);
}