Garbage Collection

塵も積もれば山

目次

Blog 利用状況

ニュース

C++とかC#とか数学ネタを投下していく予定です。

[その他のページ]
日々の四方山話を綴った日記出水の日記帳

書庫

日記カテゴリ

[アルゴリズム]ソートに生きる

プログラマになったはいいけど、どのソートを使えばいいかわからない…
そんなプログラマはいないかな?
今回の特集は、そんな悩めるプログラマ諸君に
お送りする「バブルソート」特集だ。

バブルソートは動作の遅い初心者向けのソート…なんて思っている人も
多いと思うけど、実はとっても奥深いソートなんだ。

確かに、遅いアルゴリズムの代表格であり、実用的ではないといわれている。
でも、それを補って余りある特性が、ソートの基本的な性能と改善の余地だ。

バブルソートは、順列に対して最速の性能を持っているんだ。
順列というのはソート済みになっている配列の事。
要素の数も少ないし、ほとんどの場合はソート済みのはずなんだけど…、
という場所で使えば非常に活躍できる。

さらに、クイックソートやヒープソートが持っていない
「安定なソート」という性能も見逃せない。
安定なソートというのは、要素が同じ大きさの時、
もともとの配列の前後が入れ替わらないソートをいうんだ。

例えば、トランプのカードだと、もともとが数字の順に並んでいる状態になっている時、
さらにスート(スペードやダイア)で並び替えたら
(スペード)123…JQK(ダイア)123…と並ぶってことだね。

改善の余地にも触れておこう。
バブルソートを良く眺めると、二回目以降に無駄な比較があることに気づくかな。
最初と最後に要素を交換する場所を次回の探査に生かすことで、
大幅に無駄な比較部分を減らすことが出来る。
さらに、前から後ろ、という順だけでなく後ろから前へという
逆に探査するという方法も取り入れると、
シェーカーソート(双方向バブルソート)ってソートに派生するんだ。

理解のしやすさと作り込み勝手の良さ
これでバブルソートの魅力は伝わったかな?
さぁキミも、バブルソートを使ってみよう!

投稿日時 : 2008年7月9日 0:52

Feedback

# re: [アルゴリズム]ソートに生きる 2008/07/09 1:31 れい

> バブルソートは、順列に対して最速の性能を持っているんだ。

http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%96%E3%83%AB%E3%82%BD%E3%83%BC%E3%83%88
ここのバブルソートは順列でも順列じゃなくても
n*n/2くらい回数比較してますが。

# re: [アルゴリズム]ソートに生きる 2008/07/09 3:09 出水

決め打ちで回数指定しているとそうなっちゃいますねー
たしかに、古典的バブルソートはそっちっぽい…

でも、普通に作ると交換がなくなった時点でソート終了だから、
これがn-1以内に終わるってのをちゃんと証明できる人は
バブルソートに拘る必要のない人という気がするようなしないような

# re: [アルゴリズム]ソートに生きる 2008/07/09 6:56 れい

英語版の方はその辺についてきちんと説明されてますね。

http://en.wikipedia.org/wiki/Bubble_sort

日本語版wikipediaがダメってことのようですね。

# re: [アルゴリズム]ソートに生きる 2008/07/09 8:56 長月葵

 ぶはwwwwこっそりシェーカーソート作ってたのに紹介されてるwwww
 解説の必要がなくなりました。ご協力感謝しますw

# re: [アルゴリズム]ソートに生きる 2008/07/10 7:33 出水

ちょ、たった3行の説明で終わる物じゃないですって!!
シェーカーソートはソースの書き方の工夫もできるし、
どの程度高速化するのかも奥深いし
これはこれでネタとして十分ですよ

# 【20080920東京勉強会#24】準備エントリ 2008/08/12 16:09 はつね

【20080920東京勉強会#24】準備エントリ

タイトル
名前
Url
コメント