1.14k likes | 1.23k Views
アルゴリズムとデータ構造 補足資料 8-1 「 クイックソート qsort.c 」. 横浜国立大学 理工 学部 数物・電子情報系学科 富井尚志. クイックソート. 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ 処理を行う(再帰呼び出し)。. 8 件のデータ. 65. 90. 85. 70. 86. 92. 63. 85. クイックソート. 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ 処理を行う(再帰呼び出し)。. 8 件のデータ. 65. 90.
E N D
アルゴリズムとデータ構造補足資料8-1「クイックソートqsort.c」アルゴリズムとデータ構造補足資料8-1「クイックソートqsort.c」 横浜国立大学 理工学部 数物・電子情報系学科 富井尚志
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 左端 left (定数) 右端 right (定数) 真中 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)を基準にする。 ・真中のキーよりも小さい要素は「左側」に移動。 ・真中のキーよりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 左端 left (定数) 右端 right (定数) 左候補 i (変数) 「左側」の入替候補を探す 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)を基準にする。 ・真中のキーよりも小さい要素は「左側」に移動。 ・真中のキーよりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 左端 left (定数) 右端 right (定数) 比較: 基準より 小さい OK! 左候補 i (変数) 「左側」の入替候補を探す 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 比較: 基準より 大きい NG! 左端 left (定数) 右端 right (定数) 左候補 i (変数) 「左側」の入替候補発見! 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 70 「右側」の入替候補を探す 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 比較: 基準より 大きい OK! 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 70 「右側」の入替候補を探す 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 比較: 基準より 小さい NG! 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 70 「右側」の入替候補発見! 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 「左側」の入替候補 70 「右側」の入替候補 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 入替 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 「左側」の入替候補 70 「右側」の入替候補 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 85 70 86 92 85 90 63 入替 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 「左側」の入替候補 70 「右側」の入替候補 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 入替 右端 right (定数) 左端 left (定数) 左候補 i (変数) 右候補 j (変数) 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 左候補 i (変数) 右候補 j (変数) 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 左端 left (定数) 右端 right (定数) 左候補 i (変数) 「左側」の入替候補を探す 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 左端 left (定数) 右端 right (定数) 比較: NG! 左候補 i (変数) 「左側」の入替候補発見! 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 70 「右側」の入替候補を探す 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 左端 left (定数) 右端 right (定数) 比較: OK! 左候補 i (変数) 右候補 j (変数) 70 「右側」の入替候補を探す 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 左端 left (定数) 右端 right (定数) 比較: OK! 左候補 i (変数) 右候補 j (変数) 70 「右側」の入替候補を探す 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 左端 left (定数) 右端 right (定数) 比較: NG! 左候補 i (変数) 右候補 j (変数) 70 「右側」の入替候補発見! 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 入替 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 「左側」の入替候補 70 「右側」の入替候補 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 86 92 90 85 85 70 入替 右端 right (定数) 左端 left (定数) 左候補 i (変数) 右候補 j (変数) 「左側」の入替候補 70 「右側」の入替候補 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 70 85 86 92 90 85 入替 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 70 85 86 92 90 85 左端 left (定数) 右端 right (定数) 右候補 j (変数) 右候補 j (変数) 左候補 i (変数) 左候補 i (変数) 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 70 85 86 92 90 85 右端 right (定数) 左端 left (定数) 右候補 j (変数) 左候補 i (変数) iとjが逆転: ここが分かれ目! 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 70 85 86 92 90 85 左端 left (定数) 右端 right (定数) 左端 i ↓ left 右端 j ↓ right 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 70 85 86 92 90 85 右端 right (定数) 左端 left (定数) 右端 j ↓ right 左端 i ↓ left この区間をクイックソート (再帰呼出) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 65 63 70 左端 left (定数) 右端 j ↓ right この区間をクイックソート (再帰呼出) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 65 63 70 左端 left (定数) 右端 right (定数) 真中 63 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 65 63 70 左端 left (定数) 右端 right (定数) 比較: NG! 左候補 i (変数) 63 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 65 63 70 左端 left (定数) 右端 right (定数) 比較: OK! 左候補 i (変数) 右候補 j (変数) 63 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 65 63 70 左端 left (定数) 右端 right (定数) 比較: NG! 左候補 i (変数) 右候補 j (変数) 63 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 65 63 70 入替 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 63 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 63 65 70 入替 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 63 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 63 65 70 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 左候補 i (変数) 右候補 j (変数) 63 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 63 65 70 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 63 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 63 65 70 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) iとjが逆転: ここが分かれ目! 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 63 65 70 左端 left (定数) 右端 right (定数) 左端 i ↓ left 右端 j ↓ right この区間は ソート完了 この区間をクイックソート (再帰呼出) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 2件のデータ 65 70 右端 right (定数) 左端 left (定数) 真中 65 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 2件のデータ 65 70 右端 right (定数) 左端 left (定数) 比較: NG! 左候補 i (変数) 65 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 2件のデータ 65 70 右端 right (定数) 左端 left (定数) 比較: OK! 左候補 i (変数) 右候補 j (変数) 65 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 2件のデータ 65 70 右端 right (定数) 左端 left (定数) 比較: NG! 左候補 i (変数) 右候補 j (変数) 65 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 2件のデータ 65 70 右端 right (定数) 左端 left (定数) 右候補 j (変数) 左候補 i (変数) 同じ場所を 指しているので 入替不要 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 2件のデータ 65 70 右端 right (定数) 左端 left (定数) 右候補 j (変数) 左候補 i (変数) 左候補 i (変数) 右候補 j (変数) 同じ場所を 指しているので 入替不要 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 2件のデータ 65 70 右端 right (定数) 左端 left (定数) 左候補 i (変数) 右候補 j (変数) leftとjが逆転: ソート完了! iとrightが一致: ソート完了! 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 2件のデータ 65 70 右端 right (定数) 左端 left (定数) 左候補 i (変数) 右候補 j (変数) leftとjが逆転: ソート完了! iとrightが一致: ソート完了! 呼び出し元に戻る 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 63 65 70 左端 left (定数) 右端 right (定数) 左端 i ↓ left 右端 j ↓ right この区間をクイックソート (再帰呼出) ↓ ソート完了! 呼び出し元に戻る 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 63 65 70 85 86 92 90 85 右端 right (定数) 左端 left (定数) 右端 j ↓ right 左端 i ↓ left この区間をクイックソート (再帰呼出) ↓ ソート完了! 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 63 65 70 85 86 92 90 85 右端 right (定数) 左端 left (定数) 右端 j ↓ right 左端 i ↓ left この区間をクイックソート (再帰呼出) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!
クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 5件のデータ 85 86 92 90 85 左端 left (定数) 右端 right (定数) この区間をクイックソート (再帰呼出) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。 →左右が逆になっている組み合わせを「入れ替える」!