コンテンツにスキップ
メインメニュー
メインメニュー
サイドバーに移動
非表示
案内
メインページ
最近の更新
未作成ページ
おまかせ表示
ヘルプ
MonoBook
検索
検索
ログイン
個人用ツール
ログイン
ログアウトした編集者のページ
もっと詳しく
投稿記録
トーク
「
ソート
」を編集中
ページ
議論
日本語
閲覧
編集
ソースを編集
履歴表示
ツール
ツール
サイドバーに移動
非表示
操作
閲覧
編集
ソースを編集
履歴表示
全般
リンク元
関連ページの更新状況
特別ページ
ページ情報
2014年3月3日 (月) 03:23時点における
imported>Fallout New Tokyo
による版
(
→クイックソート
)
(
差分
)
← 古い版
|
最新版
(
差分
) |
新しい版 →
(
差分
)
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。
スパム攻撃防止用のチェックです。 けっして、ここには、値の入力は
しない
でください!
'''ソート'''(英語:sort)とは、一連の[[データ]]をある一定の[[順序]]に従って並べ替える処理である。 ==主なソート[[アルゴリズム]]== 実装例は、[[整数]]を[[昇順]]に並べ替えるものを示す。 ===バブルソート=== 最も単純なソートの一つ。前から順番に隣り合う要素を比較して、大小関係が目標の順序と異なったら入れ替える。 <source lang="c"> void sort(int a[],int num) { int i,j; for(j=num-1;j>0;j--) { for(i=0;i<j;i++) { if(a[i]>a[i+1]) { int temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; } } } </source> [[枝刈り]]による、もう少し効率の良い実装も存在する。 ===挿入ソート=== これまで並べ替えた部分に、その直後の要素を目標の順序に合う位置に挿入する。 通常はバブルソートと同じ[[計算量]]とみなされるが、ソート済みの配列をソートする場合に高速。 <source lang="c"> void sort(int a[],int num) { int i,j,pos,temp; for(i=1;i<num;i++) { for(pos=i;pos>0 && a[pos-1]>a[i];pos--); temp=a[i]; for(j=i-1;j>=pos;j--)a[j+1]=a[j]; a[pos]=temp; } } </source> ===ヒープソート=== 要素を一旦全てヒープに放り込み、根の要素を順に取り出すことによりソートする。 実装が若干複雑な割にあまり高速ではない。 <source lang="c"> void sort(int a[],int num) { int i,pos; int left,right; int temp; for(i=1;i<num;i++) { pos=i; while(1) { left=pos*2+1; if(left<=i) { right=(left<i)?left+1:left; if(a[left]>a[right]) { if(a[pos]<a[left]) { temp=a[left]; a[left]=a[pos]; a[pos]=temp; pos=left; } else { if(pos==0)break; pos=(pos-1)/2; } } else { if(a[pos]<a[right]) { temp=a[right]; a[right]=a[pos]; a[pos]=temp; pos=right; } else { if(pos==0)break; pos=(pos-1)/2; } } } else { if(pos==0)break; pos=(pos-1)/2; } } } for(i=num-1;i>0;i--) { temp=a[0]; a[0]=a[i]; a[i]=temp; pos=0; while(pos*2+1<i) { left=pos*2+1; right=(left+1<i)?left+1:left; if(a[left]>a[right]) { if(a[pos]<a[left]) { temp=a[left]; a[left]=a[pos]; a[pos]=temp; pos=left; } else break; } else { if(a[pos]<a[right]) { temp=a[right]; a[right]=a[pos]; a[pos]=temp; pos=right; } else break; } } } } </source> ===シェルソート=== 挿入ソートに似ているが、初めは広い間隔でソートを行い、徐々に間隔を狭くしていく。 クイックソートの登場前は最速のソートと言われていたらしい。 <source lang="c"> void sort(int a[],int num) { int width; int i,j,k; int temp; for(width=1;width*3+1<num;width=width*3+1); for(;width>0;width/=3) { for(i=0;i<width;i++) { for(j=i;j<num;j+=width) { temp=a[j]; for(k=j-width;k>=i && a[k]>temp;k-=width) { a[k+width]=a[k]; } a[k+width]=temp; } } } } </source> ===マージソート=== 配列を短く分割し、徐々に併合していくことでソートを行う。 [[キャラソート]]でも採用されているらしい<ref>http://marineturtle.sakura.ne.jp/script/sort/hpsort/mergesort_exp.html</ref>。 <source lang="haskell"> mergeinternal [] [] = [] mergeinternal a [] = a mergeinternal [] b = b mergeinternal a b =if (head a)<=(head b) then (head a):(mergeinternal (drop 1 a) b) else (head b):(mergeinternal a (drop 1 b)) mergesort [] = [] mergesort [a] = [a] mergesort l = mergeinternal (mergesort (take (div (length l) 2) l)) (mergesort (drop (div (length l) 2) l)) </source> ===クイックソート=== まず要素の中から適当にピポットと呼ばれる基準値を設定し、ピポット未満の要素とピポット以上の要素に分ける。 分けた要素をそれぞれ同じようにソートし、ピポット未満の要素をソートしたものの後ろにピポット以上の要素をソートしたものをくっつける。 データと実装によっては遅くなることがあるが、いくつかの改善法がある。 Haskellでの記述例 <source lang="haskell"> qsort ls = if (null ls) then [] else (qsort.(filter (<(head ls))) $ ls)++ (filter (==(head ls)) ls)++ (qsort.(filter (>(head ls))) $ ls) </source> ===基数ソート=== 小さい桁から大きな桁の順に見ていき、それぞれについて安定なソートを行う。 データの種類が限られるが、特にデータ数が多い時に高速にソートできることがある。 <source lang="cpp"> void sort(unsigned int a[],int num) { unsigned int* internal_buffer=new unsigned int[num]; int counter[256]; unsigned int *src,*dest,*temp; int i,j; src=a;dest=&internal_buffer[0]; for(i=0;i<32;i+=8) { std::fill(&counter[0],&counter[256],0); for(j=0;j<num;j++) { counter[(src[j]>>i)&0xFF]++; } for(j=1;j<256;j++) { counter[j]+=counter[j-1]; } for(j=num-1;j>=0;j--) { dest[--counter[(src[j]>>i)&0xFF]]=src[j]; } temp=src;src=dest;dest=temp; } delete[] internal_buffer; } </source> === スリープソート === ソートの最終系と言われるアルゴリズムである。 詳細は「[[スリープソート]]」の項目を参照。 == 関連項目 == *[[アルゴリズム]] == 参考文献 == {{reflist}} {{stub}}
編集内容の要約:
MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MonoBook:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の確認用の質問に回答してください (
詳細
):
1たす1は?(全角で入力してください)
キャンセル
編集の仕方
(新しいウィンドウで開きます)
このページで使用されているテンプレート:
テンプレート:Reflist
(
編集
)
本文の横幅制限を有効化/無効化