下記はクイックソートの疑似コードなのですが、for文の不変の表明が成り立っていないような気がします。
コードの下に私なりにソートされるまでの様子を図にしてみました。
図のtはpivotを表しています。
質問
不変な表明には&&の左側に「l+1からmがx[l]未満である」と書かれていますがそもそも初めてfor文が実行されるタイミングでmとlが同じインデックスを示しているので、l+1はmより右にありますよね?もしそうであれば、l+1からmというのは逆方向を示していておかしくないですか。
同様に、右側も「m+1からi-1がx[l]以上である」と書いてありますが初めてfor文が実行されるタイミングではi-1はm+1よりも左側にある気がします。(わかりにくい文章で申し訳ありません)
不変の表明とは初めてTrueになったタイミングからループを抜けるまでずっとTrueになるということを意味しているのでしょうか
つまり、質問とはfor文のまわり初めの段階ではそもそも比較すらできていないのではないかということです。
よろしければ解答よろしくお願いいたします
void qsort1(l, u){ if (l >= u) return m = l for i = [l + 1, u] /* 不変な表明:x[l+1..m] < x[l] && x[m+1..i-1] >= x[l] */ if(x[i] < x[l]) swap(++m, i) swap(l, m) qsort1(l, m-1) qsort1(m+1, u)
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/17 02:12