# 题目描述
现在有 只水獭站成一排。
水獭们的身高参差不齐,看上去十分混乱。为了让队伍看上去更加整齐,Moca 决定帮助小水獭们按身高从矮到高重新排列。
# 输入格式
第一行一个正整数 ,表示小水獭的个数,保证 。
第二行 个正整数,表示每只小水獭的身高 ,保证 。
# 输出格式
第一行,将水獭们的身高从小到大排序,相邻的两个整数用一个空格隔开。
第二行一个浮点数,表示水獭们身高的中位数,保留到小数点后一位。
# 样例输入
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; | |
} |