私はクイックソートアルゴリズムのこの再帰関数がどのように動作するかを知るために、ブレークポイントを扱おうとしました。クイックソートアルゴリズムで再帰関数がどのように終了しましたか?
static public void SortQuick(int[] arr, int left, int right)
{
if (left < right)
{
int pivot = Partition(arr, left, right);
if (pivot > 1)
{
SortQuick(arr, left, pivot - 1);
}
if (pivot + 1 < right)
{
SortQuick(arr, pivot + 1, right);
}
}
}
私が知りたいのは、2つの内側の「if文」が偽になるときに何が起こっているかです。なぜ再帰が終了しないのですか?次のプロセスはどこに行くのでしょうか?
私がブレークポイント を段階的に実行しようとすると、実際に何が起こったのか分かりませんでした。左= 0 と右= 2ですが、私がブレークポイントに従うと、 は左になりました= 5、右= 9とにかく、4は私の最初のピボットで、私は に10の数字を入力しました。だから、基本的に、私はコードが のパーティションを開始していたことを知っていました。だから、 左変数が5になり、右が9になったのです。 これが起こり、この関数のどの部分が左に= 05と右= 9左= 0かつ右= 2であるかを取得しません。
これは私が入力したものです:(5 1 9 2 3 8 4 7 6 10)
私はすでにパーティションのプロセスを理解してきたので、私は私の質問の中に含まれていませんでした。前もって感謝します。 :)
の複製であります –
コールスタックをバックアップします。私が答えたところでお伝えしたように、quick-sortはバイナリグラフのような構造を作成します。ここでは、quick-sortを呼び出すたびにクイックソートの呼び出しが0〜2回発生します。たとえば、 'sort arr'は' sort [5,1,2,3,4] 'とそれ以降は' sort [9,8,7,6,10] 'を生成します。 'sort [5、1、2、3、4]'は 'sort [1,2]'とそれ以降の 'sort [5、3、4]'を望みます。 'sort [1、2]'は 'sort [1]'と後で 'sort [2]'を生成します。 'sort [1]'は何もしないので、 'sort [2]'が起動します。また、 'sort [1,2]'が実行され、 'sort [5、3、4]'がその仕事をすることができます。 – Amadan
@SyntaxError関数が "基本ケース"に達して再帰を停止すると、すでに終了しているスタックに残っている再帰呼び出しを終了します。最終的に、それをすべて開始した最初のコールに到達して終了し、プロセスが完了します。 – ray