2017-07-06 7 views
-2

複数のソースから順応したクイックソートアルゴリズムが完全に機能していないため、何が問題なのかわかりません。私はどこか別のエラーがあると思いますが、私はこれを今一時間試してみましたが、結果は変わりません。QuickSortが完全に動作していない

私はこれをマルチスレッドバージョンに適合させることになっていますが、まずエラーを修正したいと思います。

例入力:

[2, 9, 4, 1, 7, 2, 1, 1, 6, 6, 3, 8, 4, 7, 6, 7, 8, 6, 3, 3, 3, 1, 4, 1, 1, 2, 9, 7, 7, 2] 

出力:

Returns a view of the portion of this list between the specified fromIndex, 
inclusive, and toIndex, exclusive. 

として:私はList.subList(int型、intは)Javaドキュメントからこれをであることを考え出し

[1, 1, 1, 1, 1, 2, 2, 1, 2, 3, 3, 3, 2, 4, 4, 4, 3, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 9, 9] 
+2

これは、代入や生産のためですか?最初の場合は、問題を理解するまで、大規模で大規模なソートされていないリストを手作業で行ってください(これは単体テストを学ぶ絶好の機会です)。後者の場合は、これを忘れて、すでにJavaランタイムに存在する実装の1つを使用します。 –

+2

compareToメソッドをオーバーライドしましたか?通常はcompareTo sholdは0を返します。0より小さいか0より大きくします。デフォルトでは、正確に1または-1を返すように指定されていません。 –

+0

https://www.google.com/search?q=quick+sort+java&oq=quick+sort+java&aqs=chrome..69i57j0l5.2351j0j7&sourceid=chrome&ie=UTF-8#q=quicksort+java –

答えて

0

私はそれが1つのエラーでオフだったと思った。私はすべての再帰呼び出しに「左」のサブリストの最後の要素を含めていませんでした。これを行うと、それを修正:

if (0 < j) 
     serialSort(list.subList(0, j + 1)); 
1
  1. を@FFritzで述べたように、あなたのcompareTo比較に< 0> 0を使用します(これは一般的にはちょうど良い習慣です)。
  2. 再帰の最初のsubListを構築するときは、j + 1を使用してください。

このコードは動作します:

public static <T extends Comparable<T>> void serialSort(List<T> list){ 
    if (list == null || list.size() <= 1) { 
     return; 
    } 
    T pivot = list.get(list.size()/2 - 1); 
    int i = 0; 
    int j = list.size() - 1; 
    while (i < j){ 
     while (list.get(i).compareTo(pivot) < 0){ 
      i++; 
     } 
     while (list.get(j).compareTo(pivot) > 0 && j > i){ 
      j--; 
     } 
     if (i <= j) { 
      Collections.swap(list, i, j); 
      i++; 
      j--; 
     } 
    } 
    if (0 < j) 
     serialSort(list.subList(0, j + 1)); 
    if (i < list.size()) 
     serialSort(list.subList(i, list.size())); 
} 
関連する問題