c语言pat基础题改错

img


#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;
}

/* 你的代码将被嵌在这里 */

我的答案如下:

ElementType Median( ElementType A[], int N ){
    float arr[MAXN];
    for(int i=0;i<N;i++){
        for(int j=i+1;j<N;j++){
            if(arr[i]>arr[j]){
                float t;
                t=arr[i];
                arr[i]=arr[j];
                arr[j]=t;
            }
        }
    }
    int i=(N+1)/2-1;
    return arr[i];
}

img


希望可以得到指导,改正错误。

供参考:

/* 你的代码将被嵌在这里 */
ElementType Median(ElementType A[], int N)
{
    //必须采用希尔排序 
    ElementType temp;
    int gap, i, j;
    for (gap = N / 2; gap > 0; gap /= 2) 
    //gap是每次排序分组的间隔,每次间隔缩小两倍                                       
    {
        for (i = gap; i < N; i++)
        //在同一组内采用直接插入排序
        {
            for (j = i - gap; j >= 0 && A[j] > A[j + gap]; j = j - gap)
            //如果同一组内前一个元素大于相 gap间隔位置的元素,则两者交换位置
            {
                temp = A[j];
                A[j] = A[j + gap];
                A[j + gap] = temp;
            }
        }
    }
    return A[N / 2];//返回中间元素
}

ElementType Median( ElementType A[], int N ){
    float arr[MAXN];
    for(int i=0;i<N;i++){
        for(int j=0;j<N-i-1;j++){
            if(arr[j]>arr[j+1]){
                float t;
                t=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=t;
            }
        }
    }
    int i=(N+1)/2-1;
    return arr[i];
}
 

可以将排序数组的算法改为希尔排序,以应对测试大数组时超时的问题。

测试如下:

参考链接:


【算法】排序算法之希尔排序 - 知乎 一、排序算法系列目录说明冒泡排序(Bubble Sort)插入排序(Insertion Sort)希尔排序(Shell Sort)选择排序(Selection Sort)快速排序(Quick Sort)归并排序(Merge Sort)堆排序(Heap Sort)计数排序(Coun… https://zhuanlan.zhihu.com/p/122632213

PTA | 程序设计类实验辅助教学平台 千名教师建设,万道高质量题目,百万用户拼题的程序设计实验辅助教学平台 https://pintia.cn/problem-sets/14/exam/problems/743?type=6&page=0


  #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;
}

/* 你的代码将被嵌在这里 */
 
ElementType Median( ElementType A[], int N ){
 
     float * arr = A;
      int len = N;
     // https://zhuanlan.zhihu.com/p/125737294
    // https://zhuanlan.zhihu.com/p/122632213 
    // https://pintia.cn/problem-sets/14/exam/problems/743?type=6&page=0
    // 采用希尔排序来排序大量数据的数组 
    int gap, i, j;
    float temp;
    for (gap = len >> 1; gap > 0; gap >>= 1)
        for (i = gap; i < len; i++) {
            temp = arr[i];
            for (j = i - gap; j >= 0 && arr[j] < temp; j -= gap)
                arr[j + gap] = arr[j];
            arr[j + gap] = temp;
        }
 
 
 
 
    // 排序后,返回第((N+1)/2)位置的元素 
    int k=(N+1)/2-1;
    return A[k];
 
    
    
}
 

img

试试

#include <stdio.h>
#include <stdlib.h>

#define MAXN 10
typedef float ElementType;

int cmp(const void *a, const void *b) {
    return *(ElementType *)a > *(ElementType *)b;
}

ElementType Median(ElementType A[], int N) {
    qsort(A, N, sizeof(ElementType), cmp);
    int i = (N + 1) / 2 - 1;
    return A[i];
}

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;
}


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^