我正在使用一种方法来排序一个数组,其中偶数数字出现在前面,奇数数字出现在数组后面。我的任务要求我使用递归完成此任务。当我尝试打印已排序的数组时,它只打印出未排序的数组。我究竟做错了什么?
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]+" ");
}
}
}
答案 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;
}