クイック ソート アルゴリズムのこの素晴らしい視覚化を見ました: http://www.youtube.com/watch?v=Z5nSXTnD1I4
クイック ソートの背後にある原則を本当に理解していると感じ、オンラインのガイドの助けを借りて、独自のクイック ソートの作成に取り掛かりました。
これは私が思いついたものです:
public void quickSort(int[] a, int left, int right) {
int index = partition(a, left, right);
if (left < index - 1)
quickSort(a, left, index);
if (index < right)
quickSort(a, index + 1, right);
}
private int partition (int[] a, int left, int right) {
int i = left - 1;
int j = right + 1;
int pivot = a[0];
while (i < j) {
i++;
while (a[i] < pivot)
i++;
j--;
while (a[j] > pivot)
j--;
if (i < j)
swap (a, i, j);
}
return i;
}
private void swap (int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
left と right の値は次のとおりです。
left = 0
right = array size - 1
残念ながら、出力は正しくありません。問題は、ピボットの扱いにあるようです。私が見たビジュアライゼーションでは、インストラクターはピボットを物理的に削除し、ポインターを何も指さないようにしました。彼はチュートリアルを続け、i と j (私は左右と呼んでいます) が両方とも同じ空の場所を指しているポイントに到達したとき、彼はピボットを挿入して続行しました。
私は物理的にピボットを所定の位置に保持しているため、適切にソートするのが難しいと感じています.
このコードでは、次の入力を使用しています。
4 8 1 6 3 7 2 5
出力が得られます:
1 3 2 6 8 7 4 5
「4」の値 (つまり、ピボット) がアルゴリズムの開始時にソートされると、私はそれを再利用することはありません。また、quickSort メソッドに問題があると思います。
誰かが私にいくつかの指針を教えてもらえますか?ありがとう。
編集: ここにあった 2 つの編集は、不要で不正確な情報が含まれていたため削除されました。そのうちの 1 人は、ピボットを (左 + 右) / 2 に変更しました。これは、以下の回答で説明されている理由から、もちろん間違っていました。