【问题标题】:Finding Median of Array with Selection Sort使用选择排序查找数组的中位数
【发布时间】:2014-08-14 20:04:26
【问题描述】:

我正在尝试从 Java 中的未排序数组中找到中位数。首先,我需要使用选择排序技术对数组进行排序,并且我不能使用任何 Java 库方法进行排序(所以没有 Arrays.sort(array))。此外,我也无法对整个数组进行排序。我只能根据需要对尽可能多的元素进行排序以找到数组的中位数。我想对于偶数数组,它只是元素的一半加一(然后找到最后两个元素的平均值),而对于奇数数组,它只是元素的一半(最后一个是中位数)。

所以我不确定如何在正确的时间停止选择排序并从部分排序数组的最后一个或两个元素中找到中值。以下是我目前所拥有的。

import java.util.Arrays;

public class EfficientMedian
{
    public static void median(int[] values)
    {
        int i, j, temp;
        double median;

        //selection sort below
        for (i = 0; i < values.length - 1; i++)
        {
            for (j = i + 1; j < values.length; j++)
            {
                if (values[i] > values[j])
                {
                    temp = values[i];
                    values[i] = values[j];
                    values[j] = temp;
                }
            }
        }
        if (values.length % 2 == 0) //if the array is even
        {
            median = values[values.length/2]; //just a placeholder
        }
        else //if the array is odd
        {
            median = values[values.length/2];
        }
        System.out.println(Arrays.toString(values));
        System.out.println(median);
    }
    public static void main(String[] args)
    {
        int[] array1 = {567, 2, 600, 6, 601}, array2 = {45, 300, 46, 49};
        median(array1);
        median(array2);
    }
}

【问题讨论】:

  • 中值查找可以更快地完成。您的方法是二次时间,但您可以在随机预期线性时间(容易)或保证确定性线性时间(有点难)中做到这一点。
  • 即使使用Arrays.sort 对整个数组进行排序也会比您的方法更快,除非数组非常短。
  • 我了解,但我根本不允许在此任务中使用该方法。
  • 保证线性时间的算法:Median of medians

标签: java arrays median


【解决方案1】:

您的第一个循环选择要排序的元素。如果只需要中位数,则只需要对 values.length/2 个元素进行排序。所以你应该编辑这个:

for (i = 0; i < values.length - 1; i++)
    {
        ...
    }

for (i = 0; i < values.length/2; i++)
    {
        ...
    }

在“数组长度为奇数”的情况下,约定是平均中间两个值。

【讨论】:

    猜你喜欢
    • 2017-05-17
    • 2019-12-12
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2016-03-02
    • 2013-06-06
    • 2016-08-15
    相关资源
    最近更新 更多