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

来源:互联网 发布:战舰世界蒙大拿数据 编辑:程序博客网 时间:2024/05/21 17:06

近段时间在刷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 10typedef 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.csdn.net/qq_35283188/article/details/77916599)用希尔排序才完成。此文当作记录一下初步学习这几种排序的笔记


0sample, 小奇数答案正确2 ms128KB1偶数个答案正确2 ms128KB2最小N答案正确1 ms128KB3超过10,中位数是最后1个答案正确2 ms128KB4超过10,中位数是第1个答案正确2 ms164KB5大N,卡时运行超时0 ms0KB

#include <stdio.h>#define MAXN 10typedef 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]);        }}

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



阅读全文
0 0