学生の授業を手伝いながら、デュアル ピボット クイックソート アルゴリズムを実装してセッションを準備し、興味をそそられました。いくつかの統計を実行し、次に最悪の状況を解決し、次に統計を再度実行し、次の最悪の状況を解決し、このプロセスを数回繰り返した後、結果のコードは 80 行以下の単純で直接的な Python コード (少しウラジミールのコードより少ない)。新しい部分は、3 つのパーティションが、非常にシンプルでありながら効果的な後処理と組み合わせて構築される方法です。ここで、統計を適切にテストして作成する方法について、いくつかの助けが必要です。
特にスワップの数え方について: ほとんどのスワップは 3 つではなく 2 つの割り当てしか実行しません。では、それらをフル スワップとしてカウントする必要がありますか、それとも「2/3」スワップとしてのみカウントするのが公平でしょうか?
すべてのスワップを として数える1
と、Cn
inCn * N * log2(N)
は0.48
短いリスト ( <100 要素) と、数百万0.55
要素の長いリストの周りにあります。これは、 Vladimir Yaroslavskiyによって計算された理論上の最小値です。
代わりに軽いスワップを数えると2/3
、必要なスワップの数は、どのリストサイズでもほぼ等しく、およそ0.36
(stdev around 0.015
) です。
比較のCn
数の平均は、 200 万1.3
レコードのリストの場合で、これは理論上の 1.38 (2*N*ln(N) から) よりも小さく、短いリストの場合、つまり1024 要素の場合はそれよりも低くなります。1.21
これは、100% の一意の番号を持ち、Python のでランダムに並べられrandom.shuffle()
たリスト用です。
だから私の質問は:
より軽いスワップをそのように数えても大丈夫ですか、そして結果は本当に有望ですか?
また、興味深いのは次のとおりです。
- リスト内の要素が等しいほど、ソートは高速になります。
Cn
is0.03
およびは、すべての等しい要素の200 万個のリストの0.1
スワップと比較をそれぞれ表します。 Cn
ソートされたリストと逆順のソートされたリストは、すべてのサイズでほぼ同じです0.3
。1
スワップ(でカウント2/3
)と比較はそれぞれ。
最大スタック深度、スワップと比較に加えて再帰呼び出しの数を含む、より多くの統計のリストをすぐに投稿します。他に数えるべきものはありますか?
また、並べ替えアルゴリズムをテストし、結果を他の並べ替えアルゴリズムと比較するために使用できる、あらゆる種類の状況 (等しい、部分的に並べ替えられたなど) のファイルを含む「標準」テスト スイートがいくつかあります。
5 月 5 日追加: 特にソート済みリストのアルゴリズムを改善しました。それぞれ20回実行した結果を以下に示します。これは良い結果ですか?
New statistics:
Random.shuffle(), unique number
Length Swaps/Nlog2(N) Comparisons/Nlog2(N) Maximum Stack/log2(N)
16 0.367 0.922 0.250
64 0.360 1.072 0.500
256 0.342 1.122 0.625
1024 0.358 1.156 0.800
4096 0.359 1.199 0.917
16384 0.359 1.244 1.071
65536 0.360 1.244 1.125
262144 0.360 1.269 1.167
1048576 0.362 1.275 1.200
Sorted, unique numbers
Length Swaps/Nlog2(N) Comparisons/Nlog2(N) Maximum Stack/log2(N)
16 0.172 0.531 0.250
64 0.117 0.586 0.333
256 0.087 0.609 0.375
1024 0.075 0.740 0.500
4096 0.060 0.732 0.500
16384 0.051 0.726 0.500
65536 0.044 0.722 0.500
262144 0.041 0.781 0.556
1048576 0.036 0.774 0.550
2097152 0.035 0.780 0.571
Reversed order, unique numbers
Length Swaps/Nlog2(N) Comparisons/Nlog2(N) Maximum Stack/log2(N)
16 0.344 0.828 0.250
64 0.279 0.812 0.333
256 0.234 0.788 0.375
1024 0.210 0.858 0.500
4096 0.190 0.865 0.500
16384 0.172 0.855 0.500
65536 0.158 0.846 0.500
262144 0.153 0.900 0.556
1048576 0.143 0.892 0.550
2097152 0.140 0.895 0.571