C中的中位数函数

时间:2018-04-01 15:42:08

标签: c

int findMedian (int argc, char** argv){

    int temp;
    for(int i=0; i<argc; ++i) { /// bubble sort the array
        for(int j=i+1; j<argc ; ++j) {
            if(argv[i] > argv[j]) {
                temp = atoi(argv[i]);
                argv[i] = argv[j];
                *argv[j] = temp;
            }
        }
    }
    int Median;
    if(argc %2 == 0){///if is even amount of number, take the mean of middle two number

        Median= ((atoi(argv[argc / 2 ])+ atoi(argv[argc / 2 + 1])) /2);
    }
    else{ /// if is odd amount of number, take the middle number.
        Median = atoi(argv[argc / 2 + 1 ]);
    }
    return Median;
}

我的中位函数会给我一个未排序的中位数。谁知道为什么? 谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

首先,对数字的字符串表示而不是数字进行排序。假设您的数字是整数(因为您使用atoi并返回int)。您应该分配一个适当长度的整数数组,在循环中将字符串转换为带有strtol()的整数,并将整数存储到数组中。现在,数据已准备好进行排序。

注1 :不要使用atoi()进行转换,因为它无法从非数字字符串中分辨出真0 - 除非您可以保证所有字符串都是整数的有效表示数字。

注2 :由于您的函数用于计算整数数组的中位数,因此请将整数数组作为参数。在其他地方进行转换(在调用者中)。

最后,考虑使用qsort()而不是手动排序数组。已知qsort()可以使用,与您的代码不同,它的平均速度要快得多。

答案 1 :(得分:0)

如果您要进行此类比较,则必须执行以下操作之一:

sscanf(argv[i], "%f", ...);
sscanf(argv[j], "%f", ...);

然后比较scanf浮点数的值。

strcmp(argv[i], argv[j]);
stricmp(argv[i], argv[j]); // if your compiler requires it. 

或其他一些衍生物。

答案 2 :(得分:0)

1)如果要对数字数组进行排序,则需要先将字符串(char *)参数转换为数字。处理argv **字符串数组并将每个char *参数转换为带atoi的整数,或更好的strtol函数,填充新的整数数组。

2)拥有整数数组,您可以使用库qsort函数对它们进行排序。