牛客网刷题C语言 求中位数

 

 

 

题目描述

中位数定义:一组数据按从小到大的顺序依次排列,处在中间位置的一个数(或最中间两个数据的平均数). 给出一组无序整数,求出中位数,如果求最中间两个数的平均数,向下取整即可(不需要使用浮点数)

输入描述:

该程序包含多组测试数据,每一组测试数据的第一行为N,代表该组测试数据包含的数据个数,1<=N<=10000.
接着N行为N个数据的输入,N=0时结束输入

输出描述:

输出中位数,每一组测试数据输出一行

示例1

输入

复制

4
10
30
20
40
3
40
30
50
4
1
2
3
4
0

输出

复制

25
40
2

#include<stdio.h>

#include<string.h>

void qsort(int a[], int left, int right)

{

    int low,high;

    low = left;

    high = right;

    int key = a[low];

    if(left>=right)

    {

        return ;

    }

    while(low<high)

    {

        while(low<high&&a[high]>=key)

        {

            high--;

        }

        a[low]=a[high];

        while(low<high&&a[low]<=key)

        {

            low++;

        }

        a[high]=a[low];

    }

    a[low]=key;

    qsort(a,left,low-1);

    qsort(a,low+1,right);

}

int main()

{

    int n;

    int a[10000];

    while(scanf("%d",&n)!=EOF && n!=0)

    {

        for(int i=0;i<n;i++)

        {

            scanf("%d",&a[i]);

        }

        qsort(a,0,n-1);

        if(n%2==0)

        {

            int i=n/2;

            printf("%d\n",(a[i-1]+a[i])/2);

        }

        else

        {

            printf("%d\n",a[n/2]);

        }

    }

    return 0;

}


代码二:

#include<stdio.h>

#include<stdlib.h>

int cmp(const void*a,const void*b){

    return *(int *)a-*(int *)b;

}

int main(){

    int n;

    int num[10001];

    while(scanf("%d",&n)!=EOF){

        if(!n)break;

        int i;

        for(i=0;i<n;++i){

            scanf("%d",&num[i]);

        }

        qsort(num,n,sizeof(int),cmp);

        if(n%2==0){

            int temp=

            printf("%d\n",(num[n/2]+num[n/2-1])/2);

        }else{

            printf("%d\n",num[n/2]);

        }

    }

}