【问题标题】:Sorting an array recursively in Java with even numbers appearing in front of array.在 Java 中对数组进行递归排序,偶数出现在数组前面。
【发布时间】:2014-02-27 17:49:20
【问题描述】:

我正在使用一种方法来整理一个数组,其中偶数在前面出现,奇数在数组后面。我的任务要求我使用递归来完成此任务。当我尝试打印排序后的数组时,它只会打印出未排序的数组。我究竟做错了什么?

left 变量从索引 0 开始,right 变量从索引末尾开始。然后将它们进行比较,如果left 是奇数而right 是偶数,则它们交换值。如果left 是偶数,则不会发生交换,它指向数组中的下一个索引。如果right 是奇数,则不会发生交换,它指向数组中的下一个索引。它会这样做,直到所有偶数都在数组的右侧。

我收到了

“线程“main”中的异常 java.lang.StackOverflowError”。

import java.util.*;
public class Problem2{

    //i=left 
    //j=right
    //first i tried to shift the whole thing
    //have all even numbers pop to the front of array when even
    public static int[] callme(int[] arry, int left, int right){
        int temp;
        if(left>=right)       //base case, return array
            return arry; 
        else if(arry[left]%2!=0 && arry[right]%2==0){//if match, do the swap
            temp=arry[left];
            arry[left]=arry[right];
            arry[right]=temp;   
            return callme(arry, left++, right--);
        }
        else{
            if(arry[right]%2!=0){//if right side is on odd #, then decrease index
                return callme(arry, left, right--);
            }
            if(arry[left]%2==0){//if left side is on even #, then increase index
                return callme(arry, left++, right);
            }
        } 
        return arry;
    }

    public static void main(String[] args){

        //int index=0;
        int[] arry={3,5,6,8};

        int[] newarry=callme(arry, 0, arry.length-1);
        System.out.print("The new sorted array is: ");
        for(int i=0; i<newarry.length;i++){
            System.out.print(newarry[i]+" ");
        } 
    }
}

【问题讨论】:

  • 偶数是否需要升序排序(奇数也一样)?或者任务只是将所有偶数放在一侧而不关心它们的顺序?或者偶数和奇数部分是否需要按照它们开始的顺序出现?
  • 抱歉不清楚。顺序无关紧要。

标签: java arrays sorting recursion


【解决方案1】:

left++left + 1 不同。如果您想使用更高一级的left 参数递归调用该方法,则使用left + 1 调用它。

在此声明中:

  return callme(arry, left++, right--);

它的工作方式是这样的:程序保存left当前值,将left加1,然后使用之前保存的值作为递归调用的参数递增。 right-- 参数的工作方式相同。因此,当callme 调用自己时,它会使用与调用它的参数完全相同的参数来调用自己。所以你永远不会到达基本情况。

(关于递归你应该知道的其他一些事情:递归方法每次调用自己时,都会有自己的局部变量副本,包括参数。所以即使第一种方法增加left,也没有影响递归调用 left 时会是什么,因为递归方法有自己的 left。)

【讨论】:

  • 这就是问题所在。谢谢。
【解决方案2】:

如果你只希望偶数在上面,不需要左右。

你可以这样做:

int temp;

for (int i = 0; i < array.length; i++)
  if (array[i] % 2)
    for (int j = i + 1; j < array.length; j++)
      if !(array[j] % 2) {
        temp = array[j];
        array[j] = array[i];
        array[i] = temp;
        j = array.length;
      }

【讨论】:

  • 他说他必须使用递归。这样做吗? (是的,我永远不会在现实生活中使用递归来解决这个问题。但这显然是一项课堂作业,教授们似乎喜欢教授递归。它在数学上很优雅,或者其他什么。)
  • 感谢提醒,我处于“高效”思维模式。不幸的是,递归可以用于一个非常合适的问题,而对于这个特定的问题,迭代效果更好。
猜你喜欢
  • 2015-12-30
  • 2020-10-27
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 2015-10-24
  • 1970-01-01
相关资源
最近更新 更多