2017-05-25 19 views
1

クイックソートの実装に問題があります。 問題はランダムに見え、ソートされた配列はソートされません。この擬似コードに基づいてプログラムのクイックソートが機能しない

I:私のコードがある

1 procedure quick sort1(l, r); 
2 begin 
3 if ` < r then 
4 t ← A[l]; {t — pivot} 
5 s ← l; 
6 for i ← l + 1 to r do {move elements around pivot} 
7 if A[i] < t then 
8 s ← s + 1; 
9 swap(A[s], A[i]); 
10 end if; 
11 end for; 
12 swap(A[l], A[s]); 
13 quick sort1(l, s − 1); {recursive call for both subarrays} 
14 quick sort1(s + 1, r); 
15 end if; 
16 end. 

public void QuickSort(int[] A, int l, int r) 
    { 
     int t; 
     int s = 0; 
     if (l < r) 
     { 
      t = A[l]; 
      s = l; 
      for (int i = l + 1; i < r; i++) 
      { 
       if (A[i] < t) 
       { 
        s = s + 1; 
        swaponator(ref A[s], ref A[i]); 

       } 
      } 
      swaponator(ref A[l], ref A[s]); 
      QuickSort(A, l, s - 1); 
      QuickSort(A, s + 1, r); 
     } 

    } 

をしかし、それは動作しません - 私はまだ何もこれをデバッグしていないと、なぜ、見当がつかない。

お願い、誰かに私にヒントを教えてもらえますか?

よろしくお願いいたします。

+5

私の最初のヒントは、意味のある変数名を使用することです - それ以外の場合は読みにくいです。 – phuzi

+1

「うまくいかない」とはどういう意味ですか?例外はありますか?予想外の結果ですか?あなたが達成しようとしていることと、あなたがどこにこだわっているのかをより具体的にしてください。 – HimBromBeere

+0

擬似コードのソースは何ですか?私はGoogleとそれを見つけることができませんでした。 – xanatos

答えて

1

問題はforループにあります。配列内のすべての数値を反復するには、変数iがrの値に達する必要があります。

for (int i = l + 1; i <= r; i++) 
+0

Quicksortのすべての疑似コードに関する問題は、サイクル条件が' <= 'または' <'であるかどうかは必ずしも明確ではないということです。 'int [] array'を指定すると、' Quicksort'を 'Quicksort(array、0、array.Length - 1)'として呼び出さなければならないことに注意してください。 – xanatos

0

重複したエントリがあるかどうかそう

if (A[i] <= t); 

、rは当初、 'N-1' として渡す必要があり、問題が彼らのかもしれません。

関連する問題