2017-02-24 9 views
-1
public static void quickSort(Integer[] arr, int low, int high) 
    { 
     //check for empty or null array 
     if (arr == null || arr.length == 0){ 
      return; 
     } 

     if (low >= high){ 
      return; 
     } 

     //Get the pivot element from the middle of the list 
     int middle = low + (high - low)/2; 
     int pivot = arr[middle]; 

     // make left < pivot and right > pivot 
     int i = low, j = high; 
     while (i <= j) 
     { 
      //Check until all values on left side array are lower than pivot 
      while (arr[i] < pivot) 
      { 
       i++; 
      } 
      //Check until all values on left side array are greater than pivot 
      while (arr[j] > pivot) 
      { 
       j--; 
      } 
      //Now compare values from both side of lists to see if they need swapping 
      //After swapping move the iterator on both lists 
      //NUMBER (1) 
      if (i <= j) 
      { 
       swap (arr, i, j); 
       i++; 
       j--; 
      } 
     } 
     //Do same operation as above recursively to sort two sub arrays 
     //NUMBER (2) 
     if (low < j){ 
      quickSort(arr, low, j); 
     } 
     //NUMBER (3) 
     if (high > i){ 
      quickSort(arr, i, high); 
     } 
    } 

私はクイックソートアルゴリズムの初心者です。誰かが条件の目的が何であるか教えてもらえますか?すなわち、上記のクイックソートアルゴリズムで数字(1)、数字(2)、数字(3)ならば?クイックソートはいくつかの条件を削除します

Number(1)の場合、私はjよりも小さいか等しいと考えられるので、スワップはただ実行する必要があります。

数字(2)と数字(3)についても同様です。 ijインデックス位置を計算するときに、2つの元forのループだけで、そう(左と右から)交換する権利要素に対してこの条件をチェック - 私はあなたに

+0

を持っています。ありがとう – Desmond

+0

実際には、現在書かれているように、 'i <= j'は常に' NUMBER(1) 'に当てはまります。私はこのアルゴリズムが正しく実装されているとは思わない。 – khelwood

答えて

0

ナンバー1を間違って感謝してるなら、私を修正してくださいそれらがスワップされる必要がある位置にあるかどうかを確認します(暗黙的に、あるものが別のものよりも大きいためです)。

数字2と3 - これらは「分割と征服アルゴリズム」の一部であり、この部分は2つの小さな部分で配列を分割するだけです。

あなたは私が視覚化することができるように間違ってスワップを実行Jよりも大きくすることができることを証明するために私に順序付けられていない配列要素のサンプルを与えることができますthis見(ソースwikipedia

+0

私は分裂と征服のアプローチを理解しています。しかし、私はいつもjとか、j iであると思っています。したがって、これらの条件を入れる必要はありません。可能であれば、これを反証する反例を教えてください。 – Desmond

+0

いいえ、申し訳ありませんが、これは正しい方法ではありません。私はあなたがこのコードをステップバイステップでデバッグし、アルゴリズムを研究することをお勧めします。詳しく説明する文書、投稿、ビデオがあります。 – freedev

+0

クイックソートのピボットのアイデアは、このアルゴリズムを他のものより優れたものにする画期的なものです。 – freedev

関連する問題