簡體   English   中英

在Java中以遞歸方式對數組排序,偶數出現在數組前面。

[英]Sorting an array recursively in Java with even numbers appearing in front of array.

我正在使用一種方法來對數組進行排序,其中偶數在數組的前面,而奇數在數組的后面。 我的作業要求我使用遞歸來完成此任務。 當我嘗試打印排序后的數組時,它只是打印出未排序的數組。 我究竟做錯了什么?

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]+" ");
        } 
    }
}

left++left + 1 如果要使用一個高一個left參數遞歸調用該方法,請使用left + 1進行調用。

在此語句中:

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

它的工作方式是這樣的:程序將保存的當前left ,加1到left ,但隨后使用,然后才加作為參數遞歸調用保存的價值。 right--參數的工作方式相同。 因此,當callme調用自身時,它使用與調用時完全相同的參數進行調用。 因此,您永遠都無法掌握基本情況。

(別的東西,你應該知道的遞歸:每次遞歸方法調用本身,它都會有自己的局部變量的副本,其中包括參數所以,即使第一種方法增加。 left ,有什么沒有影響left會進行遞歸調用時,因為遞歸方法有其自己的left 。)

如果您只希望偶數位於頂部,則無需左右移動。

您可以這樣做:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM