Robert Sedwick Algorithms and data structure part 1-4 の本でクイックソートアルゴリズムを読んでいます。
template <class item>
static void quicksort(item [] a, int l, int r)
{
if(r <= l) return;
int i = partition(a,l,r);
quicksort(a, l, i-1);
quicksort(a, i+1, r);
}
template <class item>
int partition(item a[], int l, int r)
{
int i = l-1; j = r; item v = a[r];
for(;;) {
while( a[++i] < v );
while( v < a[--j] )
if( j == l )
break;
if( i >= j)
break; // pointer crossing.
exch(a[i], a[j]);
}
exch(a[i], a[r]);
return i;
}
本には、上記のアルゴリズムに関する次のテキストがあります。
ファイル内に重複キーが存在する場合、ポインターの交差は微妙です。i < j のときにスキャンを終了し、i-1 ではなく j を使用して、最初の再帰呼び出しの左サブファイルの右端を区切ることで、分割プロセスをわずかに改善できます。この場合、ループをもう 1 回繰り返すことで改善が見られます。スキャン ループが j と i で同じ要素を参照して終了するたびに、最終的な位置に 2 つの要素が残るためです。つまり、両方のスキャンを停止した要素です。したがって、これは分割要素および分割要素自体と等しくなければなりません。この特定のケースでは、プログラムは a[r] のパーティション キーと等しいキーを持つレコードを残すため、この変更はおそらく行う価値があります。
私の質問は
- 上記のプログラムを以下の説明でどのように変更できますか? テキストを理解するためにそれを変更するのに苦労しています。
- 重複キーがさらに存在すると、上記のクイックソートアルゴリズムが効果的に機能しないのはなぜですか。
- より多くの複製キーが存在する場合、上記の変更はどのように改善されますか?
- 著者は、「コールの最初のパーティションはクイックソート(a、i + 1、r)縮退します。その右端のキーが最小であるため」とはどういう意味ですか。? ここで、著者は退化とはどういう意味ですか?
お時間をいただきありがとうございます。