クイックソート
クイックソートの動き 22 27 7 21 21 47 6 10 33 ランダムに基準値を選ぶ i と j がすれ違うまで繰り返す 基準値以上の値を検知する 基準値以下の値を検知する i と j がまだすれ違っていなければ A[i]とA[j]を交換する i と j を一歩進める 必要があれば部分問題を解く
クイックソートの動き 10 6 6 7 21 47 27 22 33 ランダムに基準値を選ぶ i と j がすれ違うまで繰り返す 基準値以上の値を検知する 基準値以下の値を検知する i と j がまだすれ違っていなければ A[i]とA[j]を交換する i と j を一歩進める 必要があれば部分問題を解く
クイックソートの動き 6 10 10 7 21 47 27 22 33 ランダムに基準値を選ぶ i と j がすれ違うまで繰り返す 基準値以上の値を検知する 基準値以下の値を検知する i と j がまだすれ違っていなければ A[i]とA[j]を交換する i と j を一歩進める 必要があれば部分問題を解く
クイックソートの動き 6 7 10 21 47 27 27 22 33 ランダムに基準値を選ぶ i と j がすれ違うまで繰り返す 基準値以上の値を検知する 基準値以下の値を検知する i と j がまだすれ違っていなければ A[i]とA[j]を交換する i と j を一歩進める 必要があれば部分問題を解く
クイックソートの動き 6 7 10 21 22 27 47 47 33 ランダムに基準値を選ぶ i と j がすれ違うまで繰り返す 基準値以上の値を検知する 基準値以下の値を検知する i と j がまだすれ違っていなければ A[i]とA[j]を交換する i と j を一歩進める 必要があれば部分問題を解く
クイックソートの平均時間計算量
クイックソートの平均時間計算量
クイックソートの平均時間計算量 1/n … 確率 n i 0 n – 1 … 1 n i i - 1 n - i … 1 i n – 1 0 T(0)時間 T(n-1)時間 … 1 n i i - 1 n - i T(i-1)時間 T(n-i)時間 … 1 i n – 1 0 T(n-1)時間 T(0)時間
クイックソートの平均時間計算量 1 i n – 1 0 n i - 1 n - i … 1/n 確率 帰納法で証明する T(0)時間
バケットソート
バケットソート 4 7 1 2 5 3 バケツ 1 2 3 4 5 6 7 8
バケットソート データの個数がnでデータの種類がm O(n+m)時間
辞書式順序 単語a1 a2 …apと単語b1 b2 …bqの間の順序 (a1 a2 …ap)≦(b1 b2 …bq) ⇔ 1. ∃j (aj<bj) and (∀i<j ai=bi) または 2. (p<q) and (∀i≦p ai=bi) 例 yamamoto < yamazaki 1のケースでj=5 ota < otani 2のケースでp=3, q=5
バケットソートでの辞書式順序 bab bca caa acc +++ 単語キュー 文字キューa 文字キューb 各単語を単語キューに入れる テンプレートのポインタを右端の文字に合わせる 文字キューc ポインタが文字を指している間は以下を繰り返す 各文字キューを空にする 単語キューが空になるまで以下を繰り返す 単語キューから単語を取出しテンプレートにセットする ポインタが指す文字の文字キューに単語を追加する 文字(アルファベット)順に以下の操作を行う カレントの文字の文字キューの中身を単語キューに追加する テンプレートのポインタを右に一つずらす
バケットソートでの辞書式順序 bab bca caa acc +++ 単語キュー 文字キューa 文字キューb 各単語を単語キューに入れる テンプレートのポインタを右端の文字に合わせる 文字キューc ポインタが文字を指している間は以下を繰り返す 各文字キューを空にする 単語キューが空になるまで以下を繰り返す 単語キューから単語を取出しテンプレートにセットする ポインタが指す文字の文字キューに単語を追加する 文字(アルファベット)順に以下の操作を行う カレントの文字の文字キューの中身を単語キューに追加する テンプレートのポインタを左に一つずらす
バケットソートでの辞書式順序 bca caa +++ bab acc 単語キュー 文字キューa 文字キューb 各単語を単語キューに入れる テンプレートのポインタを右端の文字に合わせる 文字キューc ポインタが文字を指している間は以下を繰り返す 各文字キューを空にする 単語キューが空になるまで以下を繰り返す 単語キューから単語を取出しテンプレートにセットする ポインタが指す文字の文字キューに単語を追加する 文字(アルファベット)順に以下の操作を行う カレントの文字の文字キューの中身を単語キューに追加する テンプレートのポインタを右に一つずらす
バケットソートでの辞書式順序 bca caa bab acc +++ 単語キュー 文字キューa 文字キューb 各単語を単語キューに入れる テンプレートのポインタを右端の文字に合わせる 文字キューc ポインタが文字を指している間は以下を繰り返す 各文字キューを空にする 単語キューが空になるまで以下を繰り返す 単語キューから単語を取出しテンプレートにセットする ポインタが指す文字の文字キューに単語を追加する 文字(アルファベット)順に以下の操作を行う カレントの文字の文字キューの中身を単語キューに追加する テンプレートのポインタを右に一つずらす
バケットソートでの辞書式順序 caa bab +++ bca acc 単語キュー 文字キューa 文字キューb 各単語を単語キューに入れる テンプレートのポインタを右端の文字に合わせる 文字キューc ポインタが文字を指している間は以下を繰り返す 各文字キューを空にする 単語キューが空になるまで以下を繰り返す 単語キューから単語を取出しテンプレートにセットする ポインタが指す文字の文字キューに単語を追加する 文字(アルファベット)順に以下の操作を行う カレントの文字の文字キューの中身を単語キューに追加する テンプレートのポインタを左に一つずらす
バケットソートでの辞書式順序 caa bab bca acc +++ 単語キュー 文字キューa 文字キューb 各単語を単語キューに入れる テンプレートのポインタを右端の文字に合わせる 文字キューc ポインタが文字を指している間は以下を繰り返す 各文字キューを空にする 単語キューが空になるまで以下を繰り返す 単語キューから単語を取出しテンプレートにセットする ポインタが指す文字の文字キューに単語を追加する 文字(アルファベット)順に以下の操作を行う カレントの文字の文字キューの中身を単語キューに追加する テンプレートのポインタを右に一つずらす
バケットソートでの辞書式順序 acc +++ bab bca caa 単語キュー 文字キューa 文字キューb 各単語を単語キューに入れる テンプレートのポインタを右端の文字に合わせる 文字キューc ポインタが文字を指している間は以下を繰り返す 各文字キューを空にする 単語キューが空になるまで以下を繰り返す 単語キューから単語を取出しテンプレートにセットする ポインタが指す文字の文字キューに単語を追加する 文字(アルファベット)順に以下の操作を行う カレントの文字の文字キューの中身を単語キューに追加する テンプレートのポインタを右に一つずらす
ここからは部品
クイックソートの動き 22 27 7 21 21 47 6 10 33 ランダムに基準値を選ぶ i と j がすれ違うまで繰り返す 基準値以上の値を検知する 基準値以下の値を検知する i と j がまだすれ違っていなければ A[i]とA[j]を交換する i と j を一歩進める 必要があれば部分問題を解く
クイックソートの動き 22 27 7 21 47 6 10 33
クイックソートの動き 10 6 7 10 6 7 21 47 27 22 33 47 27 22 33 10 6 7 47 27 22 33
クイックソートの動き 10 6 7 10 6 7 21 47 27 22 33 47 27 22 33 6 10 7 10 7 47 27 22 33 10 7
クイックソートの動き 10 6 7 10 6 7 21 47 27 22 33 47 27 22 33 6 10 7 10 7 47 27 22 33 7 10
クイックソートの動き 10 6 7 10 6 7 21 47 27 22 33 47 27 22 33 6 10 7 10 7 22 27 47 33 47 33 7 10 47 33
クイックソートの動き 10 6 7 10 6 7 21 21 47 27 22 33 47 27 22 33 6 6 10 7 22 22 27 27 47 33 7 7 10 10 33 33 47 47 6 7 10 21 22 27 33 47