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;