PTA基礎程式設計題目集 6-11 求自定型別元素序列的中位數 (25分)

wyl220發表於2020-09-25

本題要求實現一個函式,求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

我的程式碼(抄自https://blog.csdn.net/MoreWindows/article/details/6668714):


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

    ElementType b[MAXN];//輔助列表
    N=N>MAXN?MAXN:N;//為避免越界,當N大於A的長度時,採用A的長度作為迴圈次數
    //複製輔助列表
    for (int i=0;i<N;i++){
        b[i]=A[i];
    }

//    // 氣泡排序
//    ElementType tmp;
//    for (int k=1;k<N;k++){
//        for (int i=0;i<N-1;i++){
//            if(b[i]>b[i+1]){
//                tmp=b[i];
//                b[i]=b[i+1];
//                b[i+1]=tmp;
//            }
//        }
//    }

//網上希爾排序

    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 (b[j] < b[j - gap])
                {
                    ElementType temp = b[j];
                    int k = j - gap;
                    while (k >= 0 && b[k] > temp)
                    {
                        b[k + gap] = b[k];
                        k -= gap;
//                        q++;
                    }
                    b[k + gap] = temp;
                }
        }
//計算中位數

    return b[N/2];


}

最開始是想用氣泡排序,但是超時了,百度到可以用希爾排序.說實話,沒看懂,主要是最內側的while k迴圈.

相關文章