6-11 求自定类型元素序列的中位数 (25分)希尔排序……

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

函数接口定义:编程

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

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

裁判测试程序样例:svg

#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函数

这道题,出得一点也不讲师德,来,骗,来,搞我心态,我一个19岁的老同志,这好吗,这很差!我就想划下水,作下简单的编程题,欺骗本身在努力学习,因而看到了序列中位数,我说这道题不就是排序而后给出指定的位置吗,为了给本身加大难度,我上来就是一个快速排序,一个计算输出下标,我所有想到了啊,按照传统,解题点到为止,因而我点了提交,结果显示最大N,超时,大意了啊,没想到这题暗藏玄机,看来是有备而来,我说,你这道题没水准标题骗淫,她说,她是乱出的,这题可不是乱出的啊,暗藏希尔排序,而希尔排序里又有直接插入排序,后来她说她在浙大教书,出过几本书,好家伙,看来是有备而来!
我劝,这位出题人,耗子尾汁,好好反思。之后不要再犯这样的诡计,小诡计啊。
pta要以和为贵,要将师德,不要搞窝里斗。谢谢朋友们。学习

ElementType Median( ElementType A[], int N )
{ 
 
  
    int i,j,gap;
    //利用希尔排序排序好数组,最深层循环为希尔排序里的直接插入排序法、
    for(gap=N/2;gap>0;gap/=2)//步长
        for(i=0;i<gap;i++)
        { 
 
  
            for(j=i+gap;j<N;j+=gap)
                if(A[j]<A[j-gap]){ 
 
  
                    float temp=A[j];
                    int k=j-gap;
                    while(k>=0&&A[k]>temp)
                    { 
 
  
                        A[k+gap]=A[k];
                        k-=gap;
                    }
                    A[k+gap]=temp;
                }
        }
    return A[N/2];
}

文末附上开始写的垃圾代码测试

int kuaipai(ElementType A[],int i,int N)
{ 
 
  
    int j=i,k=N;
    float box=A[i];
    while(j<k)
    { 
 
  
        while(j<k&&A[k]>=box) k--;
        if(k>j) { 
 
  
            A[j]=A[k];
            j++;
        }
        while(j<k&&A[j]<box) j++;
        if(j<k) { 
 
  
            A[k]=A[j];
            k--;
        }
    }
    A[j]=box;
    return j;
}
void part2(ElementType A[],int i,int N)
{ 
 
  
    if(i<N){ 
 
  
        int r=kuaipai(A,i,N);
        part2(A,r+1,N);
        part2(A,i,r-1);
    }
}
ElementType Median( ElementType A[], int N )
{ 
 
  
    
    part2(A,0,N-1);
    if(N%2==0)
    return (A[N/2]+A[N/2-1])/2.0;
    else return A[N/2];
}