/* 一组数的中位数,就是把一组数从小到大排好后位居中间的 那一个;如果有奇数个数,那么中位数就是中间的那个;如果 有偶数个数,那么中位数就是中间两个数的平均数。 那么有没有办法不用排序就可以求出中位数的方法呢? 可以回想一下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; }
原文:http://blog.csdn.net/cstopcoder/article/details/19675171