心胸决定格局,眼界决定境界...

中位数问题

	int n;
	scanf("%d", &n);
	int a[100];
	for (int i = 0; i<n; i++)
		scanf("%d", &a[i]);
	if (n % 2 == 1)
	{
		nth_element(a, a + (n-1) / 2, a + n);//  [(n-1) + 0]/2
		printf("%d\n", a[(n-1) / 2]);
	}
	else//如果是偶数,取中间两个数的平均值
	{
		nth_element(a, a + n/2, a + n);//   [(n-1) + 0]/2 右移      左右各移0.5
		int a1 = a[n / 2];
		nth_element(a, a + n/2 - 1, a + n); //左移
		int a2 = a[n / 2 - 1];
		float ans = (a1 + a2)/2.0;
	}

  

int exquick(int *a, int left, int right, int n)
{

	int ll = left, rr = right, y = a[left];
//因为后面还要用到原始的left和right,而下面的partition会改变index,所以需要把备份一下 while (ll<rr) //这步和快速排序差不多,把比它小的放左边,比它大的放右边 { while (ll<rr&&a[rr] >= y) rr--; a[ll] = a[rr]; while (ll<rr&&a[ll] <= y) ll++; a[rr] = a[ll]; } if (ll == (n - 1) / 2) return y;//如果是中位数,则返回之 if (ll>(n - 1) / 2) return exquick(a, left, ll - 1, n);//如果中位数在它的左边,则在左区域寻找 return exquick(a, ll + 1, right, n); //反之,在右区域寻找 } int n = 9; int a[9] = { 1, 3, 2, 5, 4, 7, 6, 9, 8 }; cout <<"中位数:"<< exquick(a, 0, n - 1, n) << endl;

  

posted @ 2019-03-04 17:03  WELEN  阅读(245)  评论(0)    收藏  举报