ピボットの左の要素がピボットより小さく、ピボットの右の要素がピボットよりも大きいようにピボットの周りの要素を移動するための簡単なアルゴリズムを記述しようとしていますクイックソートと同じ手順)。私は動作するコードを書いていますが、その後、私はアルゴリズムを以下に変更し、動作しません。ピボットで配列を分割する
アルゴリズムの考え方は簡単です。
2つのポインタを1つは配列の先頭に、もう1つは配列の最後にあります。 iで指し示された要素がピボットよりも小さい場合は、より大きな要素が見つかるまでスキップしてください。小さな要素より大きな要素が見つかるまでjを減少させ続ける。私は次の配列
int[] a = {46,3,8,4,2,6,244,76}
でこれを実行すると
private static void swap(int[] a, int i , int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; }
:今すぐルーチン・コード
private static void sortByPivot(int[] a) { Random r = new Random(); int index = r.nextInt(a.length); int pivot = a[index]; System.out.println("pivot = " + pivot); int i =0 , j = a.length -1; while(true) { while(a[i] <= pivot) i++; while(j >0 && a[j] >= pivot) j--; if(i <= j) { break; } else{ swap(a,i,j); } } swap(a,i,index); //swap the pivot and the i }
スワップ
[これは一般的なアルゴリズムです]ピボットが4 として選択出力がエッジにあるいくつかの他のピボットについて
4 3 8 46 2 6 244 76
であり、Iは、ヌル・ポインタ例外を得ます。
実装に欠陥がありますか?論理は私のように思える。私はいつかそれを試していますが、私はそれを修正することができません。
デバッガでコードをステップ実行し、期待どおりの動作を比較しましたか?行動はどの時点で異なったのでしょうか? –