就是排序后求中位数,直接调用sort就行,这里我手写堆排序和快排练练手。
堆排序:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[100005], num;
int n;
int parent(int i)
{
return i / 2;
}
int leftson(int i)
{
return 2 * i;
}
int rightson(int i)
{
return 2 * i + 1;
}
void swapit(int t1, int t2)
{
int t = a[t1];
a[t1] = a[t2];
a[t2] = t;
}
void maxheapify(int i)
{
int l, r, maxnum;
l = leftson(i);
r = rightson(i);
maxnum = i;
if(l <= num && a[l] > a[i])
maxnum = l;
if(r <= num && a[r] > a[maxnum])
maxnum = r;
if(maxnum != i)
{
swapit(maxnum, i);
maxheapify(maxnum);
}
return ;
}
void buildmaxheap()
{
num = n;
for(int i = n / 2; i >= 1; -- i)
maxheapify(i);
}
void heapsort()
{
buildmaxheap();
for(int i = n; i >= 2; -- i)
{
swapit(1, i);
num--;
maxheapify(1);
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; ++ i)
cin >> a[i];
heapsort();
cout << a[n / 2 + 1] << endl;
return 0;
}
快排
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[100005], n;
int partnum(int l, int r)
{
int x = a[r];
int i = l - 1;
for(int j = l; j <= r - 1; ++ j)
{
if(a[j] <= x)
{
i++;
swap(a[i], a[j]);
}
}
swap(a[i + 1], a[r]);
return i + 1;
}
void quicksort(int l, int r)
{
if(l < r)
{
int t = partnum(l, r);
quicksort(l, t - 1);
quicksort(t + 1, r);
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; ++ i)
cin >> a[i];
quicksort(1, n);
cout << a[n / 2 + 1] << endl;
return 0;
}