Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ソートアルゴリズム101/Sorting Algorithms 101
Search
akht
August 24, 2018
Programming
480
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ソートアルゴリズム101/Sorting Algorithms 101
akht
August 24, 2018
More Decks by akht
See All by akht
create-my-own-smart-contract-languages-using-llvm-1
akht
0
350
NFT tsukutte asobo
akht
1
540
What is a DAO ?
akht
0
340
create AkhToken
akht
0
98
おうちでKMP法
akht
2
710
Evaluate PHP mail in Go
akht
0
430
Other Decks in Programming
See All in Programming
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
3
340
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
4
2.5k
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
190
AIエージェント時代のコードレビューを設計する
nogu66
6
2.7k
Heart of Swift Concurrency
koher
0
740
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
490
Family mrubyの進捗
kishima
1
120
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
170
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
390
Are APIs Still Relevant in the AI Era?
soyuka
0
220
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
690
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
2.9k
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
76k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
67
58k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
360
Dealing with People You Can't Stand - Big Design 2015
cassininazir
368
27k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Speed Design
sergeychernyshev
33
2.1k
BBQ
matthewcrist
89
10k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
700
Transcript
ソートアルゴリズム 101 1
自己紹介 池田 昭仁 ( いけだ あきひと) @akht_ikd 鹿児島市内でSE( プログラマ...?) 3
年目になりました 趣味 自転車( 最近乗ってない) 野球( ほとんどやってない) 2
ソートとは? ソート (sort) は、データの集合を一定の規則に従 って並べること。日本語では整列(せいれつ)と 訳される。(以前はその原義から分類という訳語 が充てられていた)[1] ) 主にコンピュータソフトにおけるリストに表示す るデータに対し、全順序関係によって一列に並べ
ることを指す。また、単に「ソート」といった場 合、値の小さい方から大きい方へ順に並べる昇順 (しょうじゅん、ascending order )を指すことが 多い。その反対に値を大きい方から小さい方へ順 に並べることを降順(こうじゅん、descending order )という。 “ 3
要するに ソートとは、何かを並べること ソートアルゴリズムとは、 何かを並べるための手順のこと 4
ソートが、 できるとうれしいのか? ソートされてると見やすいのでうれしい ソートされていると探しやすいのでうれしい 自分で書けるとうれしいのか? 人による... ? みなさんはうれしいですか? 5
ソートアルゴリズムの性能 ( 時間計算量) アルゴリズムの性能評価の指標のひとつ どれくらい時間がかかるか( 効率が良いか) を表してい る ランダウ記法で表す よく出てくるのはこの2つ
O(n ) ・・・遅い O(nlogn) ・・・速い (ただしn がとても大きい場合) 2 6
7
代表的なソートアルゴリズム バブルソート 挿入ソート マージソート ヒープソート クイックソート それぞれざっくり紹介していきます 8
代表的なソートアルゴリズム バブルソート 挿入ソート マージソート ヒープソート クイックソート 9
バブルソート 平均計算量: O(n ) 最悪計算量: O(n ) 考え方: 隣り合うふたつの要素の大小を比較し 正しく並ぶように交換する
考え方も実装もシンプルでわかりやすい しかし遅い 2 2 10
バブルソート 動き 5 3 1 2 4 という配列を昇順に整列させる 1. まず先頭から2つに着目し、並べる
5 と3 は順序が逆転しているので入れ替える この時点で3 5 1 2 4 になる 2. その次の2つに着目し、並べる 5 と1 は順序が逆転しているので入れ替える この時点で3 1 5 2 4 になる 3. 同様に繰り返す 11
12
バブルソート 計算量 一回のスキャンでひとつずつ位置が確定していく つまり要素数がn 個のとき、 最初はn − 1 回の比較(最大値の位置が確定) 次はn
− 2 回の比較(次に大きい値の位置が確定) ・・・ 最後の1 回の比較(全ての並びが確定) となるので、 比較回数は1 + 2 + ... + (n − 1)= 回になる よって計算量は O(n ) ということになる ※最大次数の項だけ残す 2 n(n−1) 2 13
代表的なソートアルゴリズム バブルソート 挿入ソート マージソート ヒープソート クイックソート 14
挿入ソート 平均計算量: O(n ) 最悪計算量: O(n ) 考え方: 前から順番にみていって、適切な位置に挿入する 考え方も実装もシンプルでわかりやすい
しかし遅い 2 2 15
挿入ソート 考え方 2 つめの要素から最後まで走査する 着目している要素をP とする P より前の位置にある要素を見ていき P より大きければそれを後ろにずらす
P 以下の要素が見つかるまで走査し ずらしていって出来た隙間に挿入する 16
挿入ソート 動き 2 9 7 4 を昇順に整列させる 1. 2つ目の9 を選んで、それより前の要素を比べる
大きいものはないので次の要素に移る2 9 7 4 2. 7 を選んで、それより前の要素と比べる(7 はp とし て覚えておく) 9 は7 より大きいのでひとつずらす2 _ 9 4 2 は7 より小さいのでここで走査は終了。空いた 場所に7 を入れる2 7 9 4 3. 同様に繰り返す 17
18
挿入ソート 計算量 各要素について自分より前の要素と比較していく 1 つ目の要素は1 回の比較、その次は2 回の比較... とな っていく( 最悪時)
平均するとその半分なので、 + + + ... + = になる よって計算量は O(n ) ということになる 2 1 2 2 2 3 2 n−1 4 n(n−1) 2 19
代表的なソートアルゴリズム バブルソート 挿入ソート マージソート ヒープソート クイックソート 20
マージソート 平均計算量: O(nlogn) 最悪計算量: O(nlogn) 考え方: 対象を細かく分割してソートし、それらをマージする 分割統治法によるアルゴリズム 速い 21
マージソート 考え方 1. 対象を真ん中で2つに分割する 2. それぞれを何らかの方法でソートする 3. 分割された2つをマージする では、 2(
ソート) と3( マージ) をどうやるか? 22
マージソート 考え方 ソートをどうするか? 前ページで示した手順を行う関数 mergesort() を 再帰的に呼び出す マージ処理の手順 ソート済みの配列A, B
をマージして配列C を作るとき 「A, B のそれぞれ先頭の要素を比べて小さい方をC の 末尾に追加する」という手順を繰り返す 23
24
マージソート 計算量 ※ざっくり 分割とマージにはそれぞれO(logn) かかる 分割は4 -> 2 -> 1
と毎回半分になり マージは1 -> 2 -> 4 と毎回2 倍になるため 各マージにはそれぞれO(n) かかる よって全体ではO(nlogn) かかることになる 25
代表的なソートアルゴリズム バブルソート 挿入ソート マージソート ヒープソート クイックソート 26
ヒープソート 平均計算量: O(nlogn) 最悪計算量: O(nlogn) 考え方: ヒープ構造を利用してソートする 速い 27
ヒープソート 考え方 1. ヒープを作る 2. ヒープのルートノードを取り出し 結果の先頭に加える 3. ヒープを再構築する 4.
ヒープが空になるまで繰り返す 28
29
30
31
32
33
34
35
36
37
38
ヒープソート 計算量 ※ざっくり ヒープを構築 O(logn) をn 回行うのでO(nlogn) ヒープから最大値を取り出して再構築 O(logn) をn
回行うのでO(nlogn) よって全体でもO(nlogn) ということになる 39
代表的なソートアルゴリズム バブルソート 挿入ソート マージソート ヒープソート クイックソート 40
クイックソート 平均計算量: O(nlogn) 最悪計算量: O(n ) 考え方: 軸( ピボット) を選びそれより小さいものと大きいもの
にわける わかれた2つに対して再帰的に同じことを繰り返す 分割統治法によるアルゴリズム 実用上もっとも高速といわれる 2 41
クイックソート 考え方 1. ピボット( 基準値) を選ぶ 2. ピボットで入力データを2つに分ける ピボットより小さいものを前半に持っていく ピボットより大きいものを後半に持っていく
3. 2つの列を再帰的にソートする 4. 部分列をソートし終わると自動的に全体のソート も完了している 42
43
クイックソート 実装 2つに分割する処理の実装方法としては以下のような ものがある 左から順に値を調べ、ピボットより大きいなもの を見つける(i 位置) 右から順に値を調べ、ピボットより小さなものを 見つける(j 位置)
i <= j なら、その2つの値を交換する i+1 、j-1( それぞれひとつ進めた位置) から再び値を 調べていく i とj がクロスしたら、i の左側を境界として分割する 44
クイックソート 計算量 ※ざっくり 元のデータを全て分割するのにO(logn) ピボットを境にして要素をswap するのにO(n) よって全体ではO(nlogn) かかることになる しかし、例えばピボットによる分割が 常に片方0
、片方すべてと偏った場合はO(n ) になる ( 最悪ケース) 2 45
クイックソート 工夫 ピボット選びを工夫することで 最悪ケースの問題を抑えることができる たとえば 真ん中の位置の値を使う 先頭・中央・末尾の中間値を使う また、ソートを行う前に適当にシャッフルするなどの 方法もある 46
ハイブリッドなソート 複数のアルゴリズムを組み合わせて 弱点を補ったり改良を加えたものもある ( 標準ライブラリなどにはそういうものが使われてい る) Intro Sort クイックソート +
ヒープソート Tim Sort マージソート + 挿入ソート 47
ご静聴ありがとうございました 48