如何在不使用数组(或列表或使用数组/列表的任何其他集合/函数)的情况下找到n值的中值?

时间:2017-08-31 13:18:46

标签: java sorting pseudocode median

情景:

用户应该输入N(值的数量) 其次是N值。

如何输出中位数?

3 个答案:

答案 0 :(得分:2)

我建议您手动编程二叉树。您可能需要允许重复,而内置TreeSet的Java将无法执行。也可能是您可以在网络上的某处找到合适的树实现。树应该排序。有关更多灵感,请参阅Binary search tree on Wikipedia

您的主程序将逐个读取您的数字并将它们插入您的树中。之后,如果N是偶数,它将查询树中间元素或两个中间元素。

您不需要任何数组来实现您的树。为了找到第i个元素,树将执行一个inorder遍历计数遇到的元素并返回第i个元素。

快乐的编码。

答案 1 :(得分:2)

没有Array,没有List或任何其他Collection

    try (Scanner scanner = new Scanner(System.in)) {
        System.out.print("Number of numbers: ");
        int N = scanner.nextInt();
        System.out.printf("Enter the %d numbers: ", N);
        double median = IntStream.range(0, N)
                .mapToDouble(i -> scanner.nextDouble())
                .sorted()
                .skip((N-1)/2)
                .limit(2-N%2)
                .average()
                .getAsDouble();
        System.out.printf("The median is %f%n", median);
    }

(不要注意.sorted()幕后的那个男人。)

答案 2 :(得分:0)

你肯定需要一些存储空间至少N / 2个位置。没有办法解决这个问题。

在OP的评论之后编辑:

获得一些关于编程的好课程,尤其是数据结构。您不能依赖Stackoverflow来获得所有开发人员的职业生涯;-)。话虽如此,让我们给出一个起点:我在这里使用ArrayList:

int n = ...; // get N from the user;
List<Double> list = new ArrayList<Double>();
for (int i=0; i<n; i++) {
    double element = ...; // get element from the user;
    list.add(element);
}
// Have the Java library sort the list for you
Collections.sort(list);
// now pick/compute the median from the sorted list
// I'll leave that up to you..