在N(1 <= N <= 100001 且N为奇数)个数中,找到中位数。
###代码如下###
#include<iostream>
using namespace std;
void z_sort(int *a, int b, int c){
if(b<c){
int i=b;
int j=c;
int x=a[i];
while(i<j){
while(i<j&&a[j]>=x)
{
j--;
}
if(i<j){
a[i]=a[j];
}
while (i<j&&a[i]<x)
{
i++;
}
if(i<j){
a[j]=a[i];
}
}
a[i]=x;
z_sort(a,b,i-1);
z_sort(a,i+1,c);
}
}
int main()
{
int n;
cin>>n;
int a[n];
for (int i = 0; i < n; i++)
{
cin>>a[i];
}
int mid = sizeof(a)/sizeof(a[0])/2;
z_sort(a,0,n);
cout<<a[mid];
return 0;
}
输入:
5
2 4 1 3 5
输出:3
解析:先暂定一个中位数a[0],如果经过一次快速排序,a[0]刚好在中间位置,那a[0]就是中位数;如果a[0]归位后位置小于length/2,在左侧,那中位数肯定在a[i+1]~a[length-1]之间;如果a[0]归位后位置大于length/2,在右侧,那中位数肯定在a[0]~a[j-1]之间;之后开始递归(提前构造个递归函数)