2011-12-14 15 views
-1

は私が働いてそれを持っている、しかし最後のアレイは、ソートCメソッドはこれを出力しますなぜ出力が繰り返されますか?

SORTED C METHOD: 179, 181, 238, 190, 105, 144, 26, 63, 90, 14, SORTED C METHOD: 190, 238, 181, 179, 105, 144, 26, 63, 90, 14, SORTED C METHOD: 238, 190, 181, 179, 105, 144, 26, 63, 90, 14, 

なぜそれが何度もソートA法とソートBメソッドのみ出力1つの発生を繰り返していますか?以下
はコードです:

メインクラス:

import java.util.ArrayList; 
import java.util.Random; 

public class main { 
    public static void main(String[] args) { 
     ThreeSorts.SortA(randArray(0)); 
     System.out.println("\n"); 
     ThreeSorts.SortB(randArray(0)); 
     System.out.println("\n"); 
     ThreeSorts.SortC(randArray(0)); 
     System.out.println("\n"); 
    } 
    public static ArrayList<Integer> randArray(int n) { 
     ArrayList<Integer> a = new ArrayList<Integer>(n); 
     Random rand = new Random(); 
     rand.setSeed(System.currentTimeMillis()); 

     int[] x = new int[10]; 
     for (int i = 0; i < x.length; i++) { 
      Integer r = Math.abs(rand.nextInt() % 256); 
      a.add(r); 
     } 
     showArray(a); 
     return a; 
    } 

    public static void showArray(ArrayList<Integer> a) { 
     int n = a.size(); 
     System.out.println("RANDOM NUMBERS GENERATED 0 TO 255:"); 
     for (int i = 0; i < n; i++) { 
      int r = a.get(i); 
      System.out.print("|" + r + "| "); 
     } 
     System.out.println("\n"); 
    } 

    public static void showA(ArrayList<Integer> array) { 
     int n = array.size(); 
     System.out.print("SORTED A METHOD: "); 
     for (int i = 0; i < n; i++) { 
      int r = array.get(i); 
      System.out.print(r + ", "); 
     } 
    } 

    public static void showB(ArrayList<Integer> array) { 
     int n = array.size(); 
     System.out.print("SORTED B METHOD: "); 
     for (int i = 0; i < n; i++) { 
      int r = array.get(i); 
      System.out.print(r + ", "); 
     } 
    } 

    public static void showC(ArrayList<Integer> array) { 
     int n = array.size(); 

     System.out.print("SORTED C METHOD: "); 
     for (int i = 0; i < n; i++) { 
      int r = array.get(i); 
      System.out.print(r + ", "); 
     } 
    } 
} 

ソート配列クラス:

import java.util.*; 

pubic class ThreeSorts { 
    private static ArrayList<Integer> CopyArray(ArrayList<Integer> a) { 
     ArrayList<Integer> resa = new ArrayList<Integer>(a.size()); 
     for (int i = 0; i < a.size(); ++i) { 
      resa.add(a.get(i)); 
     } 
     return (resa); 
    } 

    public static ArrayList<Integer> SortA(ArrayList<Integer> a) { 
     ArrayList<Integer> array = CopyArray(a); 
     int n = a.size(), i; 
     boolean noswaps = false; 

     while (noswaps == false) { 
      noswaps = true; 
      for (i = 0; i < n - 1; ++i) { 
       if (array.get(i) < array.get(i + 1)) { 
        Integer temp = array.get(i); 
        array.set(i, array.get(i + 1)); 
        array.set(i + 1, temp); 
        noswaps = false; 
       } 
      } 
     } 
     main.showA(array); 
     return (array); 

    } 

    public static ArrayList<Integer> SortB(ArrayList<Integer> a) { 
     ArrayList<Integer> array = CopyArray(a); 
     Integer[] zero = new Integer[a.size()]; 
     Integer[] one = new Integer[a.size()]; 
     int i, b; 
     Integer x, p; 
     // Change from 8 to 32 for whole integers - will run 4 times slower 
     for (b = 0; b < 8; ++b) { 
      int zc = 0; 
      int oc = 0; 
      for (i = 0; i < array.size(); ++i) { 
       x = array.get(i); 
       p = 1 << b; 
       if ((x & p) == 0) { 
        zero[zc++] = array.get(i); 
       } else { 
        one[oc++] = array.get(i); 
       } 
      } 
      for (i = 0; i < oc; ++i) 
       array.set(i, one[i]); 
      for (i = 0; i < zc; ++i) 
       array.set(i + oc, zero[i]); 
     } 
     main.showB(array); 
     return (array); 
    } 

    public static ArrayList<Integer> SortC(ArrayList<Integer> a) { 
     ArrayList<Integer> array = CopyArray(a); 
     SortC(array, 0, array.size() - 1); 
     return (array); 
    } 

    public static void SortC(ArrayList<Integer> array, int first, int last) { 
     if (first < last) { 
      int pivot = PivotList(array, first, last); 
      SortC(array, first, pivot - 1); 
      SortC(array, pivot + 1, last); 
     } 

    } 

    private static void Swap(ArrayList<Integer> array, int a, int b) { 
     Integer temp = array.get(a); 
     array.set(a, array.get(b)); 
     array.set(b, temp); 
    } 

    private static int PivotList(ArrayList<Integer> array, int first, int last) { 
     Integer PivotValue = array.get(first); 
     int PivotPoint = first; 
     for (int index = first + 1; index <= last; ++index) { 
      if (array.get(index) > PivotValue) { 
       PivotPoint = PivotPoint + 1; 
       Swap(array, PivotPoint, index); 
      } 
     } 
     main.showC(array); 
     Swap(array, first, PivotPoint); 
     return (PivotPoint); 
    } 
} 

P.S.私はEclipse Javaを使用しています

+2

再フォーマットしていただきありがとうございました...私の目が痛かった! –

+0

おそらくこれは宿題をタグ付けできますか? –

+0

iveはすべての答えを試してみましたが、それでもまだ動作しません:-( – howzat

答えて

0

SortCは3回呼び出される可能性がありますか?

public static void SortC(ArrayList<Integer> array,int first,int last){ 
    if (first < last) { 
     int pivot = PivotList(array,first,last); 
     SortC(array,first,pivot-1); 
     SortC(array,pivot+1,last); 
    } 
} 
  • SortC()通話PivotList()
  • PivotList()呼び出しSystemOut
  • から showC()
  • showC()プリント

を私の代わりに再帰的な方法で、印刷を行うには、あなたの主なSortCメソッドを更新したいです:

public static ArrayList<Integer> SortC(ArrayList<Integer> a) { 
    ArrayList<Integer> array = CopyArray(a); 
    SortC(array, 0, array.size() - 1); 
    main.showC(array) // print only when finished sorting! 
    return (array); 
} 
+0

私はピボットソート方法 – howzat

+0

を使用して数字の並び順を並べ替えるだけだと思います。あなたはあなたが何をしようとしているのか推測することができます。 – jamesTheProgrammer

+0

ダミーのforループを追加してみましたが、(int s = 0; s howzat

1

あなたshowCメソッドの呼び出しがissue.Tryこれです:あなたのコードで

public static void SortC(ArrayList<Integer> array, int first, int last) { 
    if (first < last) { 
     int pivot = PivotList(array, first, last); 
     SortC(array, first, pivot - 1); 
     SortC(array, pivot + 1, last); 
    } 
    main.showC(array)//this method has to be called only when your array has been sorted 
    } 

問題は、あなたが配列あなたはこのことができます新しいピボットpoint.Hopeを見つけているたびに印刷されています...ハッピーコーディング

+0

返信いただきありがとうございますが、それは正しい答えである – howzat

+1

のいずれも動作しません。 SortC(配列、最初、最後)は再帰関数であり、複数回呼び出されます。そこにCを表示すると、複数回表示されます。ピボットリストやスワップの機能も同じです。 – Newtopian

+1

"どちらもうまくいかない"としたら、出力はどうだったのですか?違う?正しく説明するか、正しい "このような"種類のソリューションを見つけることは難しいでしょう。 。 。 – buch11

0

私はbunch11が正しい答えを与えたと述べましたが、実際にはあなたのargorithm内でShowCを使用して複数回呼び出されるためです。

しかし、これは基本的な問題ではない症状です。あなたの問題は、あなたのアルゴリズム関数(SortedArrayクラス)とあなたのユーティリティ関数(メインクラス)の間の不必要な結合を作成することです。

つまり、SortedArraysクラスはメインクラスに依存してはならないため、SortedArraysクラスの何もメインで何も呼び出されていないはずです。

メイン関数でshow関数を呼び出し、SortedArraysクラスでその関数の記述を削除することで、このコードを非常に簡単に調整すると、コードはそれぞれ1回だけ表示されます。

そうのような:

public static void main(String[] args) { 
     showA(ThreeSorts.SortA(randArray(0))); 
     System.out.println("\n"); 
     showB(ThreeSorts.SortB(randArray(0))); 
     System.out.println("\n"); 
     showC(ThreeSorts.SortC(randArray(0))); 
     System.out.println("\n"); 
    } 

次に、あなたの他のクラスから任意のmain.showXXXを削除します。これは、各ソート関数が配列を返すと仮定します。

このように、各クラスは単一の目的を持ち、すべてのことを理解して理解するのがずっと簡単です。同じ関数(またはオブジェクト指向の同じクラス)で目的(ソートと表示)を混在させると、このような副作用がしばしば発生します。

最後に、アルゴリズムが正しいかどうかを確認しようとはしませんでしたが、コード構造に集中しました。それは他のエラーがある可能性がありますし、再び、それはあなたのためにすべての仕事を行うことができない宿題です:-)それはあなたがあまりにも心配していないので、うまくやっているようだ。

1

あなたのpublic static void SortC(ArrayList<Integer> array,int first,int last) の方法はすべてです。それはRecursionのために複数回呼び出されます。

しかし、あなたが間違った方法で置くことを望むなら、以下のコード行があなたを助けます。 class ThreeSorts内部など

public static boolean isPrinted; 

として変数を定義し、与えられたか、ただのは、それが動作します貼り、それをコピーし、以下のようにあなたのPivotList()メソッドを更新します。

private static int PivotList(ArrayList<Integer> array, int first, int last) { 
     Integer PivotValue = array.get(first); 
     int PivotPoint = first; 
     for (int index = first + 1; index <= last; ++index) { 
      if (array.get(index) > PivotValue) { 
       PivotPoint = PivotPoint + 1; 
       Swap(array, PivotPoint, index); 
      } 
     } 
     if (!isPrinted) { 
      Main.showC(array); 
      isPrinted = true; 
     } 
     //Main.showC(array); 
     Swap(array, first, PivotPoint); 
     return (PivotPoint); 
    } 
関連する問題