#include <stdio.h>
const int MAX_SIZE = 100001;
int arr[MAX_SIZE];
void swap(int& a, int& b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
void build_heap(int size)
{
int i = 1;
while (i <= size){
int c = i;
while (c != 1){
if (arr[c] > arr[c>>1]){
swap(arr[c], arr[c>>1]);
c >>= 1;
}
else{
break;
}
}
++i;
}
}
void heapify(int size)
{
int c = 1;
while ((c<<1) <= size){
int max_num = (c<<1);
if ((c<<1) + 1 <= size && arr[(c<<1)+1] > arr[(c<<1)]){
max_num = (c<<1) + 1;
}
if (arr[max_num] > arr[c]){
swap(arr[max_num], arr[c]);
c = max_num;
}
else{
break;
}
}
}
int get_middle(int size)
{
build_heap(size);
int i = 0;
for (i = size; i > size/2; --i){
swap(arr[1], arr[i]);
heapify(i-1);
}
return arr[size/2+1];
}
int main()
{
int n, i;
scanf("%d", &n);
for (i = 1; i <= n; ++i){
scanf("%d", &arr[i]);
}
printf("%d\n", get_middle(n));
return 0;
}
POJ 2388 (堆排序求中位数)
最新推荐文章于 2022-03-17 22:15:45 发布