在Java中递归排序数组,并在数组前面出现偶数。

时间:2014-02-04 00:53:55

标签: java arrays sorting recursion

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

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

我得到了

  

“线程中的异常”主“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]+" ");
        } 
    }
}

2 个答案:

答案 0 :(得分:1)

left++left + 1不同。如果要以一个更高的left参数递归调用该方法,请使用left + 1调用它。

在此声明中:

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

它的工作方式是:程序保存{em>当前值left,将{1}添加1,但随后使用之前保存的值< / strong>它作为递归调用的参数递增。 left参数的工作方式相同。因此,当right--调用自身时,它会使用与调用它完全相同的参数调用自身。所以你永远不会到达基础案例。

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

答案 1 :(得分:0)

如果您只想让偶数位于顶部,则无需左右执行。

你可以这样做:

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;
      }