创建一个中位数数组。JAVA

创建一个中位数数组。JAVA,java,arrays,algorithm,loops,for-loop,Java,Arrays,Algorithm,Loops,For Loop,我很难找到此练习的解决方案: Given scores, an array of integers representing all test and assignment scores, your task is to return an array of integers where output[i] represents the median grade after all marks up to (and including) scores[i] have been entered.

我很难找到此练习的解决方案:

Given scores, an array of integers representing all test and assignment scores, your task is to return an array of integers where output[i] represents the median grade after all marks up to (and including) scores[i] have been entered. Your instructor is a generous marker, so they always round the median up to the nearest integer.

median* - The median of an N-element sequence is defined as follows: If N is odd, the median is the element which stands in the middle of the sequence after it is sorted. If N is even, the median is the average (mean) of the two "middle" elements of the sequence after it is sorted.

Example

•For scores = [100, 20, 50, 70, 45] the output should be medianScores(scores) = [100, 60, 50, 60, 50].

After each score is entered, the median is recalculated as follows:
◦For [100], the median is 100 since it's the only element.
◦For [20, 100], the median is (20 + 100)/2 = 60 since there's an even number of elements.
◦For [20, 50, 100], the median is 50 (middle element).
◦For [20, 50, 70, 100], the median is (50 + 70)/2 = 60(mean of the two middle elements).
◦For [20, 45, 50, 70, 100], the median is 50 again (middle element).


Input / Output
我一直在试图得到一个有效的代码,到目前为止,如果数组的长度是奇数,那么代码是有效的,但是如果它是偶数,那么它将返回一个错误的结果

 public static int[] getMedian(int[] arr){

    int[] sortedArr = new int[arr.length];
    int length = arr.length-1;
    int odd = arr.length-1;
    int even = arr.length-1;

    for(int i=0;i<arr.length;i++) {

        sortedArr[length] = arr[i];
        Arrays.sort(sortedArr);

        if (length % 2 == 0) {
            arr[i] = sortedArr[odd];
            odd--;
        } else {
            arr[i] = (sortedArr[even] + sortedArr[even - 1]) / 2;
            even--;
        }
        length--;
    }
return arr;
}

该算法的工作原理是将arr中的元素添加到分拣机中。元素被排序,然后它检查sortedar是偶数还是奇数。如果是偶数,则arr[i]成为中间元素;如果是奇数,则arr[i]是中间元素之和除以2


非常感谢您的帮助。

将数组复制到SorterDarray时,您正在覆盖现有值

    public static void main(String[] args) {
        int[] ret = getMedian(new int[]{100,20,50,70,45});
        System.out.println(Arrays.toString(ret));
    }

    public static int[] getMedian(int[] arr) {

        int[] sortedArr = new int[arr.length];
        int[] retArr = new int[arr.length];
        int len = 1;
        int realLength = arr.length-1;

        for (int i = 0; i < arr.length; i++) {

            sortedArr[realLength-i] = arr[i];
            Arrays.sort(sortedArr);
           // arrays are accessed in reverse so adjust is needed using
           // array length.
            if (len % 2 == 1) {
                // use middle value
                retArr[i] = sortedArr[realLength-len/2];
            } else {
                // average middle values 
                retArr[i] = (sortedArr[realLength-len/2]
                        + sortedArr[realLength-len/2 + 1]) / 2;
            }
            len++;
        }
        return retArr;
    }

}


将数组复制到SorterDarray时,您正在覆盖现有值

    public static void main(String[] args) {
        int[] ret = getMedian(new int[]{100,20,50,70,45});
        System.out.println(Arrays.toString(ret));
    }

    public static int[] getMedian(int[] arr) {

        int[] sortedArr = new int[arr.length];
        int[] retArr = new int[arr.length];
        int len = 1;
        int realLength = arr.length-1;

        for (int i = 0; i < arr.length; i++) {

            sortedArr[realLength-i] = arr[i];
            Arrays.sort(sortedArr);
           // arrays are accessed in reverse so adjust is needed using
           // array length.
            if (len % 2 == 1) {
                // use middle value
                retArr[i] = sortedArr[realLength-len/2];
            } else {
                // average middle values 
                retArr[i] = (sortedArr[realLength-len/2]
                        + sortedArr[realLength-len/2 + 1]) / 2;
            }
            len++;
        }
        return retArr;
    }

}


非优化解

首先是一种仅计算阵列中值的方法:

/**慷慨与否:一到四舍五入,零到四舍五入*/ 专用静态最终int=1; 专用静态int medianint[]arr{ a.sortarr; int mid=阵列长度/2; 如果mid+mid==arr.length{//little优化,它是偶数吗 返回arr[mid-1]+arr[mid]+慷慨/2; }否则{ 返回arr[mid]; } } 然后只需为每个子数组调用它:

//传递的数组将被部分排序 私有静态int[]getMedianint[]arr{ int[]结果=新int[arr.length]; 对于int i=0;i 私有静态int medianint[]arr,int len{ Arrays.sortarr,0,len; int-mid=len/2; 如果mid+mid==len{//little优化,它是偶数吗 返回arr[mid-1]+arr[mid]+慷慨/2; }否则{ 返回arr[mid]; } } 在getMedian中,称为

结果[i]=medianarr,i+1;
非优化解

首先是一种仅计算阵列中值的方法:

/**慷慨与否:一到四舍五入,零到四舍五入*/ 专用静态最终int=1; 专用静态int medianint[]arr{ a.sortarr; int mid=阵列长度/2; 如果mid+mid==arr.length{//little优化,它是偶数吗 返回arr[mid-1]+arr[mid]+慷慨/2; }否则{ 返回arr[mid]; } } 然后只需为每个子数组调用它:

//传递的数组将被部分排序 私有静态int[]getMedianint[]arr{ int[]结果=新int[arr.length]; 对于int i=0;i 私有静态int medianint[]arr,int len{ Arrays.sortarr,0,len; int-mid=len/2; 如果mid+mid==len{//little优化,它是偶数吗 返回arr[mid-1]+arr[mid]+慷慨/2; }否则{ 返回arr[mid]; } } 在getMedian中,称为

结果[i]=medianarr,i+1;
为了提高效率,第一步是确定更好的算法

让我们调用创建的数组

我将使用两个堆:

k/2或k/2+1最低值到第k个索引的最大剩余堆数,取决于k是偶数还是奇数。 k/2最高值的最小堆权限,最高可达第k个索引 那么

if k is even, median[k] = (left.max() + right.min())/2
if k is odd, median[k] = left.max()
初始化:

left <- min (scores[0], scores[1])
right <- max (scores[0], scores[1])
如果k为奇数:

全局复杂性:Onlogn


我不太懂java。如果java没有堆,我想您可以使用PriorityQueue

为了提高效率,第一步是确定更好的算法

让我们调用创建的数组

我将使用两个堆:

k/2或k/2+1最低值到第k个索引的最大剩余堆数,取决于k是偶数还是奇数。 k/2最高值的最小堆权限,最高可达第k个索引 那么

if k is even, median[k] = (left.max() + right.min())/2
if k is odd, median[k] = left.max()
初始化:

left <- min (scores[0], scores[1])
right <- max (scores[0], scores[1])
如果k为奇数:

全局复杂性:Onlogn


我不太懂java。如果java没有堆,我想您可以使用PriorityQueue

如果数组的长度是偶数,那么它将断开,这是什么意思?我用偶数数组长度测试它,程序没有崩溃。你的意思是输出不正确吗?@djharten是的,结果不正确,我为糟糕的术语道歉,我还是新的。你需要将偶数和奇数除以2。此外,SorterDar中只有默认数据。我建议使用Arrays.copyOfRange从原始数组创建子数组,因为sort将始终对整个数组进行排序,包括尚未设置为零的元素,或者使用仅对范围进行排序的排序方法:但不在SorterDar[length]处添加元素,使用i表示Obs:偶数和奇数必须从i计算,子数组的大小在每次迭代时对数组排序似乎不是很有效。你对效率有什么限制吗?最大数组大小是多少?如果数组的长度是偶数,则表示什么?我正在用伊芙测试它
n个数组长度,程序不会崩溃。你的意思是输出不正确吗?@djharten是的,结果不正确,我为糟糕的术语道歉,我还是新的。你需要将偶数和奇数除以2。此外,SorterDar中只有默认数据。我建议使用Arrays.copyOfRange从原始数组创建子数组,因为sort将始终对整个数组进行排序,包括尚未设置为零的元素,或者使用仅对范围进行排序的排序方法:但不在SorterDar[length]处添加元素,使用i表示Obs:偶数和奇数必须从i计算,子数组的大小在每次迭代时对数组排序似乎不是很有效。你对效率有什么限制吗?最大阵列大小是多少?