Java 使用Reduce-and-converge查找中值

Java 使用Reduce-and-converge查找中值,java,median,Java,Median,您好,我遇到了以下问题的困难,我似乎 1) 不完全理解分区方法 2) 我无法确定我的代码是否存在问题 问题描述:使用reduce和concurve递归查找三个或更多整数数组中的中值。我们将使用只考虑从给定索引开始并在另一个索引结束的部分数组的约定。这样,递归调用可以通过数组的任何部分工作。初始调用将传入索引0,并将索引传递给最后一个元素 RAC中位数([2,1,3,-2,8],0,4)→ 2 RAC中位数([-4,6,2],0,2)→ 2 RAC中位数([4,2,48,1,50],0,4)→ 4

您好,我遇到了以下问题的困难,我似乎
1) 不完全理解分区方法
2) 我无法确定我的代码是否存在问题

问题描述:使用reduce和concurve递归查找三个或更多整数数组中的中值。我们将使用只考虑从给定索引开始并在另一个索引结束的部分数组的约定。这样,递归调用可以通过数组的任何部分工作。初始调用将传入索引0,并将索引传递给最后一个元素

RAC中位数([2,1,3,-2,8],0,4)→ 2
RAC中位数([-4,6,2],0,2)→ 2
RAC中位数([4,2,48,1,50],0,4)→ 4

代码给我:

int partition(int[] nums, int begin, int end) {
  int splitPos = begin;
  int pivotValue = nums[begin];
  for(int i=begin+1; i<=end; i++) {
    if(nums[i] > pivotValue) {
      splitPos++;
      swap(nums, i, splitPos);
    }
  }
  swap(nums, begin, splitPos);
  return splitPos;
}

void swap(int[] nums, int pos1, int pos2) {
  int temp = nums[pos1];
  nums[pos1] = nums[pos2];
  nums[pos2] = temp;
}
int分区(int[]nums,int开始,int结束){
int splitPos=开始;
int pivotValue=nums[begin];
for(int i=开始+1;i数据透视值){
splitPos++;
交换(nums、i、splitPos);
}
}
交换(nums、begin、splitPos);
返回splitPos;
}
无效交换(int[]nums,int pos1,int pos2){
int-temp=nums[pos1];
nums[pos1]=nums[pos2];
nums[pos2]=温度;
}
这是我的代码:

public int rAcMedian(int[] nums, int begin, int end) {
  if (begin < end){
    int splitPos = partition(nums, begin, end);

    if (splitPos == end/2) return nums[splitPos];
    if (splitPos > end/2) return nums[rAcMedian(nums, splitPos+1, end)];
    if (splitPos < end/2) return nums[rAcMedian(nums, begin, splitPos-1)];

  }
  return 0;
}
public int rAcMedian(int[]nums,int begin,int end){
如果(开始<结束){
int splitPos=分区(nums、begin、end);
if(splitPos==end/2)返回nums[splitPos];
if(splitPos>end/2)返回nums[rAcMedian(nums,splitPos+1,end)];
if(splitPos
当我运行代码时,会出现以下错误:

您可以尝试对数组进行合并排序,并取中间值(偶数长度为n/2,奇数长度为n/2+1)


您可以尝试对数组进行合并排序,并取中间值(偶数长度为n/2,奇数长度为n/2+1)

调用数组上的分区时,将数组中的第一个值作为数据透视值。分区结束时,pivotValue左边的所有元素都大于pivotValue,右边的所有元素都小于或等于pivotValue。
返回的整数是pivotValue结束的位置。以下是一个例子:

public static void main(String[] args) {
    int[] arr = {4, 3, 1, 7, 5};
    int part = partition(arr, 0, arr.length - 1);
    System.out.println(Arrays.toString(arr));   //[5, 7, 4, 3, 1]
    System.out.println(part);   //2
}
有2个元素大于数据透视值4。因此,4被向右移动了2个位置,并在索引2处结束,索引2也在末尾返回

请注意,我将给定的函数设置为静态,以便使用它们

我想借助这些函数,您可以创建自己的算法,然后在对数组进行排序后,只需获取中间元素。不过,您的老师可能打算以另一种方式使用它。

当您调用数组上的分区时,将数组中的第一个值作为数据透视值。分区结束时,pivotValue左边的所有元素都大于pivotValue,右边的所有元素都小于或等于pivotValue。
返回的整数是pivotValue结束的位置。以下是一个例子:

public static void main(String[] args) {
    int[] arr = {4, 3, 1, 7, 5};
    int part = partition(arr, 0, arr.length - 1);
    System.out.println(Arrays.toString(arr));   //[5, 7, 4, 3, 1]
    System.out.println(part);   //2
}
有2个元素大于数据透视值4。因此,4被向右移动了2个位置,并在索引2处结束,索引2也在末尾返回

请注意,我将给定的函数设置为静态,以便使用它们

我想借助这些函数,您可以创建自己的算法,然后在对数组进行排序后,只需获取中间元素。你的老师很可能打算用另一种方式