不排序求中位数
/*
一组数的中位数,就是把一组数从小到大排好后位居中间的
那一个;如果有奇数个数,那么中位数就是中间的那个;如果
有偶数个数,那么中位数就是中间两个数的平均数。
那么有没有办法不用排序就可以求出中位数的方法呢?
可以回想一下qsort中partition的作用:找出一个分界点,左边的
数都小于分界点值,右边的数都大于分界点值。所以,只要不断地
进行partition,直到分界点是left与right的中央元素就行了。需要
注意的是,还要考虑到有奇数个还是偶数个数的问题。
*/
#include<cstdio>
using namespace std;
void swap(int *a,int *b)
{
int t=*a;
*a=*b;
*b=t;
}
void partition(int A[],int left,int right,int *pos)
{
int data=A[left];
int i;
for(*pos=left,i=left+1;i<=right;i++)
{
if(A[i]<data)
{
(*pos)++;
swap(&A[*pos],&A[i]);
}
}
swap(&A[left],&A[*pos]);
}
int Getmid(int A[],int n)
{
int left=0;
int right=n-1;
int mid=(left+right)/2;
int pos,count=1;
while(1)
{
partition(A,left,right,&pos);
if(pos==mid)
break;
else if(pos>mid)
right=pos-1;
else
left=pos+1;
//1th pos=3 1 5 3 7 11 9
//2th pos=0 1 5 3 7 11 9
//3th pos=2 1 3 5 7 11 9
}
return (n&0x1)!=0?A[mid]:(A[mid]+A[mid+1])/2;
}
int main(int argc,char *argv[])
{
int Array[]={7,5,3,1,11,9};
int mid;
mid=Getmid(Array,sizeof(Array)/sizeof(int));
printf("The mid number of the array is: %d\n",mid);
return 0;
}