2012-04-01 14 views
1
import java.util.Arrays; 
import java.util.ArrayList; 
import java.util.Scanner; 
import java.util.Collections; 
import java.util.List; 

public class TennisTournament { 

    public static void main (String [] args) { 
    Scanner input = new Scanner(System.in); 
    ArrayList <Integer> nums = new ArrayList<Integer>(); 
    while (input.hasNextInt()) { 
     nums.add(input.nextInt()); 
    } 
    System.out.println(nums); 
    tournament(nums); 
    } 

    public static void tournament(ArrayList <Integer> list) { 
    int midPoint = list.size()/2; // returns the index number of half of the lists size 
    int midPoint2 = list.size()/2; 
    if (list.size() != 1 || midPoint != 1) { 
     for (int i = 0; i < midPoint2; i++) { // while is bigger than mid point, increment by one 
     if (list.get(i) < list.get(midPoint)) { 
      Collections.swap(list, i, midPoint); 
     } 
     midPoint++; 
     } 
     System.out.println(list); 
     int newPoint = midPoint2/2; 
     midPoint2 = newPoint; 
    } 
    tournament(list); 

    } 
} 

さて、私は再帰のアイデアにかなり新しく、今はすべて無限ループです。したがって、最初のメソッドでは、配列を半分に分けて解析し、配列の前半の最初の要素と配列の後半の最初の要素を比較し、2番目の要素がより大きく、そしてスワップしてください。そして、それはすべてうまく動作しています、それは私がしたいことを正確にやっています。 [3、5、8、2、1、7、6、4] [3,7,8,4,1,5,6,2] 次のステップは、私が取り組んでいる要素。だから、最初の例では、私は半分にしたいと思っている要素の数を0にしたいので、0-list.sizeの代わりに0-list.size()/ 2を使いたいので、最初の4つの数字を入力し、2つの数字でもう一度やり直して中間点が1になります。 私はそれがどのように達成できるかについての少しの洞察力は素晴らしいでしょう。 いいえ、宿題はありません。再帰の問題

+2

私はこれを宿題としてタグ付けしたいと思います。それは...ですか? –

+0

再帰の「終了条件」とは何ですか?それがそのままでは、オリジナルの変更されていないリストで永遠に「トーナメント()」と呼ばれているように見える。これは決して小さなリストで呼び出されることはなく、再帰呼び出しを停止するものもありません。 –

+0

@Brandon:質問の最後の行に注意してください。_And no、homework._ :) – sarnold

答えて

2

私は、リストのサイズが(List.subList(...)を使用)、ハーフレングスのサブリストには、2回の再帰呼び出しでtournament(list);コールを交換2.

0

よりも小さいときに、分裂を停止する必要がありますね。リストが長さ1の場合はショートカットしてください。