それで、ごく最近、好奇心から、CLRS の「Introduction to Algorithms」という本を購入しました。この本を読み始めたとき、本にあるいくつかの非常に典型的なアルゴリズムが非常に異なる方法で実装されていることに気付きました。
CLRS でのクイックソートの実装は、一般的な Hoare のクイックソートのアルゴリズムとは大きく異なります。
だから私の質問に来て...
void insertion_sort_by_robertsedgewick(int a[],int n)
{
for(int i=0;i<n;i++)
{
for(int j=i;j>0;j--)
{
if(a[j]<a[j-1])
{
swap(a[j],a[j-1]);
}
}
}
}
Robert Sedgewick がアルゴリズムに関する Coursera コースで使用したコードです。
対照的に、CLRS で提供される挿入ソートの実装は、
void insertion_sort_CLRS(int a[] , int n)
{
int key,j;
for(int i=1; i<n; i++)
{
key = a[i];
j = i - 1;
while(j>=0 && a[j]>key)
{
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
これについてかなり奇妙なのは、実行時間です。2 つの異なる実装を実行したときの結果は次のとおりです。
配列の要素数: 10,000
Robert Sedgewick の実装にかかった時間: 0.235926 秒
CLRS の実装にかかる時間: 0.078608 秒
誰か私にこれらの結果を説明してもらえますか? アルゴリズムはほとんど同じです。実装のみが異なります。実装のわずかな違いが、実行時間にこれほど大きな違いをもたらすのはなぜでしょうか?