6-11 求自定类型元素序列的中位数

本文针对PTA平台上的基础编程题进行了解析,重点讲解了一道求自定义类型元素序列中位数的问题,并通过多种排序算法(包括冒泡排序、快速排序、插入排序和希尔排序)来解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近段时间在刷PTA,想不到基础编程题都够我喝一壶,弱弱地打击了一下我的积极性,但是题还是要刷的对吧。下面是题目


6-11 求自定类型元素序列的中位数(25 分)
本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第⌊N/2+1⌋大的元素。其中集合元素的类型为自定义的ElementType。

函数接口定义:

ElementType Median( ElementType A[], int N );


其中给定集合元素存放在数组A[]中,正整数N是数组元素个数。该函数须返回N个A[]元素的中位数,其值也必须是ElementType类型。


裁判测试程序样例:


#include <stdio.h>


#define MAXN 10
typedef float ElementType;


ElementType Median( ElementType A[], int N );


int main ()
{
    ElementType A[MAXN];
    int N, i;


    scanf("%d", &N);
    for ( i=0; i<N; i++ )
        scanf("%f", &A[i]);
    printf("%.2f\n", Median(A, N));


    return 0;
}




/* 你的代码将被嵌在这里 */
输入样例:


3
12.3 34 -5
输出样例:


12.30

问题在于用例5,无论用冒泡、快排和插入都是运行超时,最后模仿网上(http://blog.youkuaiyun.com/qq_35283188/article/details/77916599)用希尔排序才完成。此文当作记录一下初步学习这几种排序的笔记


0	sample, 小奇数	答案正确	2 ms	128KB
1	偶数个	答案正确	2 ms	128KB
2	最小N	答案正确	1 ms	128KB
3	超过10,中位数是最后1个	答案正确	2 ms	128KB
4	超过10,中位数是第1个	答案正确	2 ms	164KB
5	大N,卡时	运行超时	0 ms	0KB

#include <stdio.h>

#define MAXN 10
typedef float ElementType;

ElementType Median( ElementType A[], int N );
void showarray( ElementType a[], int len );
void quicksort( ElementType A[], int l, int r);
void bubblesort( ElementType A[], int N );
void insertsort( ElementType a[], int len );
void shellsort(ElementType a[], int len);

int main ()
{
    ElementType A[MAXN];
    int N, i;

    scanf("%d", &N);
    for ( i=0; i<N; i++ )
        scanf("%f", &A[i]);
    printf("%.2f\n", Median(A, N));
    system("pause");
}

ElementType Median( ElementType A[], int N )
{
    int j;
    j = N/2;
    //quicksort(A, 0, N-1);
    shellsort(A, N);
    printf("\n*********************Final********************\n");
    showarray(A,N);
    printf("\n*********************Final********************\n");
    return A[j];
}

void shellsort(ElementType a[], int len)
{
    int gap, i, j;
    ElementType tmp;
    for(gap = len/2; gap>0; gap/=2)
    {
        for(i=gap; i<len; i++)
        {
            tmp = a[i];
            for(j=i; j>0 && a[j-gap]>tmp; j-=gap)
            {
                a[j] = a[j-gap];  //前一位和当前位a[j]交换
            }
            a[j] = tmp;
        }
    }
}


/** 插入排序,先小范围比较,再慢慢扩大
 * 例如数组 a[12 45 1 902 32 42 3  53]
 * 先取12 ,往前没有数比较,不管,直接下一步
 * 再取45,形成[12, 45],45往前和12比较,12<45,位置不变
 * 再取1,形成[12, 45, 1],1往前和45比较,45比1大,则a[2]变成45(45退一位,45本来是a[1]),a[1]空出;1再往前和12比,12比1大,所以a[1]变成12,不能再往前,a[0]=0
 * 再取902,形成[1, 12, 45, 902],不变
 * 再取32,形成[1, 12, 45, 902, 32],32和902比,902比32大,则a[4]变成902;32再往前和45比,45比32大,则a[3] = 45;32再往前和12比,12不比32大,所以结束for循环,此时,j为a[2](即45之前的位置)
 *
 */

void insertsort( ElementType a[], int len )
{
    int i,j;
    ElementType tmp;
    for(i=0; i<len; i++)
    {
        tmp = a[i];
        for(j=i; j>0 && a[j-1]>tmp; j--)
        {
               a[j] = a[j-1];  //前一位和当前未a[j]交换
        }
        a[j] = tmp;
    }
}

/**< 这里是快排 */
void quicksort( ElementType A[], int l, int r)
{
    ElementType tmp;
    int i, j;

    if(l < r)
    {
        i = l;
        j = r;
        tmp = A[i];
        while(i < j)
        {
            while(A[j]>tmp && i<j) //一定要i<j,因为下面j--改变了j的值,没有这个判定,无法跳过A[j]大于tmp不用改变j值的情况
                j--;               //由右往左寻找,遇到A[j]>tmp则跳过,寻找下一个
            if(i<j)
            {
                A[i] = A[j];
                i++;
            }
            while(A[i]<tmp && i<j) //改变这里的A[i]<tmp小于的符号,同时改变42行A[j]>tmp的大于符号,可以改为由大到小排列
                 i++;
            if(i<j)
            {
                A[j] = A[i];
                j--;
            }
            //showarray(A, r+1);
            //printf("\n***************************\n");
        }
        /**< 如果r == l,下面的语句不会执行,这也是迭代停止的条件 */
        A[i] = tmp;
        quicksort(A, l, i-1);
        quicksort(A, i+1, r);
    }
}

/**< 下面是冒泡排序 */

void bubblesort( ElementType A[], int N )
{
    ElementType temp;
    int i, j;
    for(i=0; i<N-1; i++)
    {
        for(j=0; j<N-i-1; j++)
        {
            if(A[j+1]<A[j]) //从大到小排列
            {
                //printf("A[%d]:%.2f > A[%d]:%.2f ??\n", j+1, A[j+1], j, A[j]);
                temp = A[j];
                A[j] = A[j+1];
                A[j+1] = temp;
            }
        }
     }
}
void showarray(ElementType a[], int len)
{
    int j;
    for(j=0; j<len; j++)
        {
             printf("a[%d]:%.2f\t", j, a[j]);
        }
}

然后继续段错误。。。。。真的一点脾气都没有。到底哪里出错了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值