wikipediaに掲載されているinsertion sortのコードは駄目すぎらしい
やねうらおさんが久しぶりに更新されていた
insertion sortについて。これは「既にソートされている」リストに「効率よく追加するソート」らしい
http://e-words.jp/w/E68CBFE585A5E382BDE383BCE38388.html
与えられた要素がソート済み状態に近ければ比較的高速だが、要素が逆順に並んでいるととてつもない時間を要する。 この欠点をある程度緩和した改良版にシェルソートである。
大学でqsortやらshellsortやbublesortは実習した覚えがありますが、
insertion sortは実習した記憶がないです。
ある意味、アルゴリズムの演習向けというよりは、リアルな実世界向けのソートかもしれません
http://d.hatena.ne.jp/yaneurao/20091126#p1
> 例ってのはエッセンスを伝えるものだから insertion sortに限って言えばそれは間違いです。これは、要素数が少ないときのために特化されたソートであって、 もともとの狙いが高速化にあります。insertion sortで書いて高速化しないなら何の利用価値もないのです。
確かに。解りやすさ優先ならqsortなんかあり得ないでしょうし(^^;
コンピュータ将棋では、手のオーダリングでソートをみなさんやってると思いますが、
insertion sortを使われている人は意外に少ないのではないかと思います。
使ってますか?
misakiは使ってないんですよね。全部手を生成してからまとめてソートしているので、
GenCap、GenNoCap、GenDropみたいにカテゴリー別に生成する場合は、
ソート済みのリストに追加していくソートでしょうから、効率がよくなるのだろうと思います
ちなみにBonanzaのInsertion sortのコード
/* insertion sort */ psortv[nqmove] = INT_MIN; for ( i = nqmove-2; i >= 0; i-- ) { value = psortv[i]; move = pmove[i]; for ( j = i+1; psortv[j] > value; j++ ) { psortv[j-1] = psortv[j]; pmove[j-1] = pmove[j]; } psortv[j-1] = value; pmove[j-1] = move; } ptree->move_last[ply] = ptree->move_last[ply-1] + nqmove; ptree->anext_move[ply].move_last = pmove; ptree->anext_move[ply].next_phase = next_quies_captures; }