web-dev-qa-db-ja.com

あなたが知っている最も曖昧なソートアルゴリズムは何ですか?

Sortvis.orgのブログ投稿で cyclesort について読むだけです。これは、私が知らない数学(整数セットの順列でのサイクルの検出)を使用しているため、おそらくこれまでに聞いた中で最も不明瞭なものです。

あなたが知っている最も不明瞭なものは何ですか?

22
sova

Patience sorting について聞いたことがありますか?さて、あなたは持っています...

9
Mason Wheeler

Slowsort は、(分割統治とは対照的に)乗算と降伏によって機能します。興味深いのは、構築可能な最も効率の悪いソートアルゴリズムであるためです(漸近的に、そのようなアルゴリズムは低速ですが、常に結果に向かって機能している必要があるという制限があります)。

これによりbogosortからオフセットされます。最良の場合、bogosortは非常に効率的です。つまり、配列がすでにソートされている場合です。スローソートは、そのような最良の場合の動作に「苦しむ」ことはありません。最良の場合でも、それはまだランタイムを持っています $\Omega(n^\frac{\log_2n}{2+\epsilon})$ ために ε > 0。

これは、ドイツ語を元にしたその擬似コードです Wikipediaの記事

function slowsort(A, i, j):
  if i >= j: return

  m = (i + j) / 2
  slowsort(A, i, m)
  slowsort(A, m + 1, j)

  if A[j] < A[m]:
    swap(A[j], A[m])

  slowsort(A, i, j - 1)
12
Konrad Rudolph

これが不明瞭と見なされるかどうかはわかりませんが、最もばかげた並べ替えの "アルゴリズム"の1つは Bogosort です。 Bogosortページのリンクも楽し​​いです。

そして、「量子ボゴソート」のセクションからこの宝石があります。

間違いなく、2を作成するN ユニバースもメモリを大量に消費します。

うーん...あなたはそれを言うことができる:-)。

8
Stephen C

Sleep Sort はかなり斬新です。

    #!/bin/bash
    function f() {
        sleep "$1"
        echo "$1"
    }
    while [ -n "$1" ]
    do
        f "$1" &
        shift
    done
    wait

使用例:

    ./sleepsort.bash 5 3 6 3 6 3 1 4 7
6
Mike Weller

別のあいまいな「アルゴリズム」は Intelligent Design Sort -ですが、アルゴリズムが速くないか、メモリ消費が少ないです:)

6
Caspar

バブルソートはこの状況でも間違った答えになると思います

:)

5
OscarRyz

Knuthボリューム31は、演習の1つに対する答えとして、基本的には古代のコードゴルフである名前のないソートアルゴリズムの実装を提供します。これは、MIXアセンブリ言語で記述できる最も短いソートです。短いコードはO(N)しかし複雑さ...

1少なくとも古いエディションでは。新版のMIXALへの変更を考えると、それがまだそこにあるのか、それともオリジナルのMIXALで行ったのと同じくらい微妙な意味があるのか​​さえわかりません。

3
Jerry Coffin

私のデータ構造クラスでは、(明示的に) Stooge sort の正確性を証明する必要がありました。実行時間はO(n ^ {log 3/log 1.5})= O(n ^ 2.7095 ...)です。

3
Alex ten Brink

それが最も不明瞭かどうかはわかりませんが、 スパゲッティの並べ替え は、それを使用できる状況で最高の1つです。

2
Caleb

元のKnuthの本の1つである「並べ替えと検索」には、ハードディスクを使用せずにテープファイルを並べ替えるプロセスを図解した中間の展開図がありました。私はそれが6つのテープドライブを使用し、それぞれが前方に読み取られた、後方に読み取られた、巻き戻し、またはアイドルであったことを明示的に示したと思います。今日それは時代遅れの技術への記念碑です。

2
Andy Canfield

Google Code JamにはGorosortと呼ばれるアルゴリズムに関する問題があり、彼らはこの問題のために発明したと思います。

五郎は4本の腕を持っています。五郎はとても強いです。あなたは五郎を台無しにしないでください。 GoroはN個の異なる整数の配列をソートする必要があります。アルゴリズムはGoroの強みではありません。強さは五郎の強さです。五郎の計画は、両手の指を使って配列のいくつかの要素を押し下げ、3番目と4番目の拳でテーブルをできるだけ強く叩くことです。これにより、アレイのセキュリティ保護されていない要素が空中に飛び上がり、ランダムにシャッフルされ、空のアレイの場所にフォールバックします。

http://code.google.com/codejam/contest/dashboard?c=975485#s=p

1
MatrixFrog

私はかつてCRAYアセンブラでベクトルレジスタのバブルソートを実行していました。マシンにはダブルシフト命令があり、ベクトルレジスタの内容を1ワードずつ上下にシフトできました。 1つおきのポイントを2つのベクトルレジスタに配置すると、完了するまで別のメモリ参照を行わなくても、完全なバブルソートを実行できます。バブルソートのN ** 2の性質を除いて、それは効率的でした。

また、1回のソートで可能な限り高速に長さ4のベクトルの浮動小数点ソートを実行する必要がありました。それをテーブルルックアップで行いました(A2-A1の符号ビットは1ビットで、A3-A1の符号は別のビットを形成します...その後、テーブル内の置換ベクトルを調べます。これは実際に私が思いついた最速のソリューションでした。しかし、現代のアーキテクチャではうまく機能しません。浮動小数点と整数の単位が離れすぎています。

1
Omega Centauri

名前は覚えていませんが、基本的には

while Array not sorted

  rearrange the array in a random order
0
Akash

シェルソート

アルゴリズム自体はそれほどあいまいではないかもしれませんが、実際に実際に使用されている実装を誰が挙げられるでしょうか。できます!

[〜#〜] tigcc [〜#〜] (TI-89/92/V200グラフ計算機用のGCCベースのコンパイラ)は、標準でqsort実装にシェルソートを使用します図書館:

__ATTR_LIB_C__ void qsort(void *list, short num_items, short size, compare_t cmp_func)
{
  unsigned short gap,byte_gap,i,j;                
  char *p,*a,*b,temp;                       
  for (gap=((unsigned short)num_items)>>1; gap>0; gap>>=1)    // Yes, this is not a quicksort,
    {                                                         // but works fast enough...    
      byte_gap=gap*(unsigned short)size;
      for(i=byte_gap; i<((unsigned short)num_items)*(unsigned short)size; i+=size)
        for(p=(char*)list+i-byte_gap; p>=(char*)list; p-= byte_gap)
          {
            a=p; b=p+byte_gap;
            if(cmp_func(a,b)<=0) break;
            for(j=size;j;j--)
              temp=*a, *a++=*b, *b++=temp;
          }
    }
}

コードサイズを低く保つために、クイックソートを優先してシェルソートが選択されました。漸近的な複雑さは悪化しますが、TI-89にはRAM(190K、プログラムサイズとアーカイブされていない変数の合計サイズを差し引いたもの)がたくさんありません)。アイテムの数が少なくなると想定しても安全です。

私が書いているプログラムでは遅すぎると不平を言った後、より速い実装が書かれました。アセンブリの最適化と共に、より良いギャップサイズを使用します。それはここにあります: qsort.c

0
Joey Adams