PTA 求自定类型元素序列的中位数,冒泡超时,改为希尔排序

来源:互联网 发布:lte mrr弱覆盖优化 编辑:程序博客网 时间:2024/04/30 14:57
4-11 求自定类型元素序列的中位数   (25分)

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

函数接口定义:

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

其中给定集合元素存放在数组A[]中,正整数N是数组元素个数。该函数须返回NA[]元素的中位数,其值也必须是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;}/* 你的代码将被嵌在这里 */

输入样例:

312.3 34 -5

输出样例:

12.30
ElementType Median( ElementType A[], int N ){    for(int i = 0; i < N; i++)    {        for(int j = 0; j < N; j++)        {            if(A[i] < A[j])            {                ElementType t = A[j];                A[j] = A[i];                A[i] = t;            }        }    }    //for(int i = 0; i < N; i++)printf("%f ",  A[i] );    return A[N/2];}

冒泡最后两个测试过不了


改为希尔
ElementType Median(ElementType A[], int N){    int i, j, Increment;    ElementType Tmp;    for (Increment = N / 2; Increment > 0; Increment /= 2) { //设置增量,一般为数组长度的一半        for (i = Increment; i < N; i++) {            Tmp = A[i];//将A[5]的值存到临时变量temp中            for (j = i; j >= Increment; j -= Increment) {                if (Tmp < A[j - Increment])//如果A[5]的值小于A[0],则把A[0]的值赋给A[5]                {                    A[j] = A[j - Increment];                }                else                    break;            }            A[j] = Tmp;//因为J经过递减,此时A[J]其实为A[0],把TEMP中A[5]的初始值赋予A[0],完成两个位置的值的交换        }    }    return A[N / 2];}



关于希尔排序这篇博文 :http://blog.csdn.net/morewindows/article/details/6668714



0 0
原创粉丝点击