6-11 求自定型別元素序列的中位數 (25分)希爾排序……

符義的部落格發表於2020-11-20

本題要求實現一個函式,求N個集合元素A[]的中位數,即序列中第⌊(N+1)/2⌋大的元素。其中集合元素的型別為自定義的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

這道題,出得一點也不講師德,來,騙,來,搞我心態,我一個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];
}

相關文章