当前位置: 首页 > 知识库问答 >
问题:

使用选择排序查找数组中位数

臧曜瑞
2023-03-14

我试图从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);
    }
}

共有1个答案

韦嘉颖
2023-03-14

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

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

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

仅供参考,在“数组长度为奇数”的情况下,约定是对中间两个值进行平均。

 类似资料:
  • 求一个未排序数组的中值,我们可以对n个元素做O(nlogn)时间的min-heap,然后我们可以逐个抽取n/2个元素得到中值。但是这种方法需要O(nlogn)时间。 我们能在O(n)时间内通过某种方法做同样的事情吗?如果可以,那么请告诉或建议一些方法。

  • 问题内容: 我在数据库字段中的序列化数组中存储项目列表(我在使用PHP / MySQL)。 我想要一个查询,该查询将选择所有包含数组中这些项目之一的记录。 像这样: 希望这是有道理的。 任何想法将不胜感激。 谢谢 问题答案: 因此,您是要使用MySQL搜索已通过serialize命令进行序列化并存储在数据库字段中的PHP数组吗?我的第一个反应是:天哪。我的第二个反应是:为什么?在 理智 的事情可以

  • 这是来自coursera的算法课程中的实践问题;我被困了几个星期。 问题在于:<code>给定一个由n个不同的未排序元素x<sub>1</sub>组成的数组,x<sub>2</sub>,…,x<sub>n</次级>ε,加权中值是一个元素xk,对于该元素,值小于xk的所有元素的总权重最多为(总权重)/2,值大于xk的元素的总重量最多为(总重)/2。观察最多有两个加权值。演示如何在O(n)最坏时间内计

  • 我想在未排序列表中找到近似中位数,我知道两种算法 算法1-快速选择 算法 2 - 中位数的中位数 我不能在我的项目中使用快速选择,因为它在最坏的情况下需要O(n^2。我听说过中位数,但我的同事建议它需要O(n)和一些常数因子,因此它的时间复杂度是Cn,常数因子比quickselect大。我想知道与中位数相关的常数因子是什么?为什么中位数不使用9元素的伪中位数?< br >或者,他们是否有任何其他算

  • 我试图找到给定排序数组的最大K数。 ex:输入- 到目前为止,我编写的代码返回最大的K元素,但它需要返回最大的K数字。任何帮助都将不胜感激。

  • 本文向大家介绍php选择排序法实现数组排序实例分析,包括了php选择排序法实现数组排序实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了php选择排序法实现数组排序的方法。分享给大家供大家参考。具体分析如下: 选择排序法的基本思路:直接用案例来说明吧,比如有一个数组$arr = array(2,6,3,9),从大到小排序。 第一次大循环:它首先假设$arr[0]为最大值,然后分别跟$