不排序求中位数

不排序求中位数

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


你可能感兴趣的:(C++,二分查找,基础题)