# 题目描述

现在有 nn 只水獭站成一排。

水獭们的身高参差不齐,看上去十分混乱。为了让队伍看上去更加整齐,Moca 决定帮助小水獭们按身高从矮到高重新排列。

# 输入格式

第一行一个正整数 nn,表示小水獭的个数,保证 1n20001 \le n \le 2000

第二行 nn 个正整数,表示每只小水獭的身高 aia_i,保证 1ai23111 \le a_i \le 2^{31} − 1

# 输出格式

第一行,将水獭们的身高从小到大排序,相邻的两个整数用一个空格隔开。

第二行一个浮点数,表示水獭们身高的中位数,保留到小数点后一位。

# 样例输入

5
7 2 11 10 13

# 样例输出

2 7 10 11 13
10.0

# 题解:快速排序

快排板子题。这里介绍一下 C 语言中的快排模板: void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)) (位于 stdlib.h 库中)

第一个参数 void *base :这里传入待排数组序列的首元素指针。

第二个参数 size_t nitems :这里传入待排序元素个数。

第三个参数 size_t size :这里传入每个元素占用空间的大小(通常我们直接写 sizeof(arr[0])

第四个参数 int (*compar)(const void*, const void*) :这里传入一个比较函数的指针,即自定义一个比较函数,这个函数接受两个待比较元素的指针,如果第一个参数该排在第二个参数前面,则返回负数;如果第一个参数和第二个参数相等,则返回 0 ;如果第一个参数该排在第二个参数后面,则返回正数。 void* 是任意数据类型的指针变量,在使用时需先强制转化为实际变量类型的指针变量再使用。

以下是参考代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int n, a[2010];
int cmp(const void *a, const void *b)
{
    return *(int*)a > *(int*)b; // 当 a > b 时,应交换两元素。注意将 void* 指针强制转换为 int* 指针,再取出变量的值
}
int main()
{
    // freopen("B.in", "r", stdin);
    // freopen("B.out", "w", stdout);
    scanf("%d", &n);
    for (int i = 1; i <= n; ++ i)
        scanf("%d", &a[i]);
    
    qsort(a + 1, n, sizeof(a[1]), cmp);
    for (int i = 1; i <= n; ++ i)
        printf("%d ", a[i]);
    
    puts("");
    if (n & 1)
        printf("%.1lf\n", 1.0 * a[(n + 1) >> 1]);
    else
        printf("%.1lf\n", (1.0 * a[n >> 1] + a[(n >> 1) + 1]) / 2);
    
    return 0;
}