1 / 114

アルゴリズムとデータ構造 補足資料 8-1 「 クイックソート qsort.c 」

アルゴリズムとデータ構造 補足資料 8-1 「 クイックソート qsort.c 」. 横浜国立大学 理工 学部 数物・電子情報系学科 富井尚志. クイックソート. 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ 処理を行う(再帰呼び出し)。. 8 件のデータ. 65. 90. 85. 70. 86. 92. 63. 85. クイックソート. 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ 処理を行う(再帰呼び出し)。. 8 件のデータ. 65. 90.

owen-strong
Download Presentation

アルゴリズムとデータ構造 補足資料 8-1 「 クイックソート qsort.c 」

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. アルゴリズムとデータ構造補足資料8-1「クイックソートqsort.c」アルゴリズムとデータ構造補足資料8-1「クイックソートqsort.c」 横浜国立大学 理工学部 数物・電子情報系学科 富井尚志

  2. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85

  3. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 左端 left (定数) 右端 right (定数) 真中 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)を基準にする。 ・真中のキーよりも小さい要素は「左側」に移動。 ・真中のキーよりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  4. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 左端 left (定数) 右端 right (定数) 左候補 i (変数) 「左側」の入替候補を探す 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)を基準にする。 ・真中のキーよりも小さい要素は「左側」に移動。 ・真中のキーよりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  5. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 左端 left (定数) 右端 right (定数) 比較: 基準より 小さい OK! 左候補 i (変数) 「左側」の入替候補を探す 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  6. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 比較: 基準より 大きい NG! 左端 left (定数) 右端 right (定数) 左候補 i (変数) 「左側」の入替候補発見! 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  7. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 70 「右側」の入替候補を探す 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  8. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 比較: 基準より 大きい OK! 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 70 「右側」の入替候補を探す 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  9. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 比較: 基準より 小さい NG! 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 70 「右側」の入替候補発見! 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  10. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 「左側」の入替候補 70 「右側」の入替候補 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  11. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 90 85 70 86 92 63 85 入替 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 「左側」の入替候補 70 「右側」の入替候補 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  12. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 85 70 86 92 85 90 63 入替 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 「左側」の入替候補 70 「右側」の入替候補 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  13. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 入替 右端 right (定数) 左端 left (定数) 左候補 i (変数) 右候補 j (変数) 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  14. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 左候補 i (変数) 右候補 j (変数) 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  15. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 左端 left (定数) 右端 right (定数) 左候補 i (変数) 「左側」の入替候補を探す 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  16. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 左端 left (定数) 右端 right (定数) 比較: NG! 左候補 i (変数) 「左側」の入替候補発見! 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  17. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 70 「右側」の入替候補を探す 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  18. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 左端 left (定数) 右端 right (定数) 比較: OK! 左候補 i (変数) 右候補 j (変数) 70 「右側」の入替候補を探す 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  19. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 左端 left (定数) 右端 right (定数) 比較: OK! 左候補 i (変数) 右候補 j (変数) 70 「右側」の入替候補を探す 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  20. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 左端 left (定数) 右端 right (定数) 比較: NG! 左候補 i (変数) 右候補 j (変数) 70 「右側」の入替候補発見! 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  21. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 85 70 86 92 90 85 入替 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 「左側」の入替候補 70 「右側」の入替候補 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  22. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 86 92 90 85 85 70 入替 右端 right (定数) 左端 left (定数) 左候補 i (変数) 右候補 j (変数) 「左側」の入替候補 70 「右側」の入替候補 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  23. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 70 85 86 92 90 85 入替 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  24. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 70 85 86 92 90 85 左端 left (定数) 右端 right (定数) 右候補 j (変数) 右候補 j (変数) 左候補 i (変数) 左候補 i (変数) 70 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  25. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 70 85 86 92 90 85 右端 right (定数) 左端 left (定数) 右候補 j (変数) 左候補 i (変数) iとjが逆転: ここが分かれ目! 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  26. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 70 85 86 92 90 85 左端 left (定数) 右端 right (定数) 左端 i ↓ left 右端 j ↓ right 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  27. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 65 63 70 85 86 92 90 85 右端 right (定数) 左端 left (定数) 右端 j ↓ right 左端 i ↓ left この区間をクイックソート (再帰呼出) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  28. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 65 63 70 左端 left (定数) 右端 j ↓ right この区間をクイックソート (再帰呼出) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  29. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 65 63 70 左端 left (定数) 右端 right (定数) 真中 63 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  30. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 65 63 70 左端 left (定数) 右端 right (定数) 比較: NG! 左候補 i (変数) 63 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  31. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 65 63 70 左端 left (定数) 右端 right (定数) 比較: OK! 左候補 i (変数) 右候補 j (変数) 63 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  32. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 65 63 70 左端 left (定数) 右端 right (定数) 比較: NG! 左候補 i (変数) 右候補 j (変数) 63 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  33. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 65 63 70 入替 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 63 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  34. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 63 65 70 入替 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 63 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  35. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 63 65 70 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 左候補 i (変数) 右候補 j (変数) 63 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  36. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 63 65 70 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) 63 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  37. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 63 65 70 左端 left (定数) 右端 right (定数) 左候補 i (変数) 右候補 j (変数) iとjが逆転: ここが分かれ目! 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  38. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 63 65 70 左端 left (定数) 右端 right (定数) 左端 i ↓ left 右端 j ↓ right この区間は ソート完了 この区間をクイックソート (再帰呼出) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  39. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 2件のデータ 65 70 右端 right (定数) 左端 left (定数) 真中 65 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  40. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 2件のデータ 65 70 右端 right (定数) 左端 left (定数) 比較: NG! 左候補 i (変数) 65 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  41. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 2件のデータ 65 70 右端 right (定数) 左端 left (定数) 比較: OK! 左候補 i (変数) 右候補 j (変数) 65 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  42. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 2件のデータ 65 70 右端 right (定数) 左端 left (定数) 比較: NG! 左候補 i (変数) 右候補 j (変数) 65 基準 x (定数) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  43. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 2件のデータ 65 70 右端 right (定数) 左端 left (定数) 右候補 j (変数) 左候補 i (変数) 同じ場所を 指しているので 入替不要 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  44. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 2件のデータ 65 70 右端 right (定数) 左端 left (定数) 右候補 j (変数) 左候補 i (変数) 左候補 i (変数) 右候補 j (変数) 同じ場所を 指しているので 入替不要 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  45. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 2件のデータ 65 70 右端 right (定数) 左端 left (定数) 左候補 i (変数) 右候補 j (変数) leftとjが逆転: ソート完了! iとrightが一致: ソート完了! 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  46. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 2件のデータ 65 70 右端 right (定数) 左端 left (定数) 左候補 i (変数) 右候補 j (変数) leftとjが逆転: ソート完了! iとrightが一致: ソート完了! 呼び出し元に戻る 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  47. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 3件のデータ 63 65 70 左端 left (定数) 右端 right (定数) 左端 i ↓ left 右端 j ↓ right この区間をクイックソート (再帰呼出) ↓ ソート完了! 呼び出し元に戻る 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  48. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 63 65 70 85 86 92 90 85 右端 right (定数) 左端 left (定数) 右端 j ↓ right 左端 i ↓ left この区間をクイックソート (再帰呼出) ↓ ソート完了! 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  49. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 8件のデータ 63 65 70 85 86 92 90 85 右端 right (定数) 左端 left (定数) 右端 j ↓ right 左端 i ↓ left この区間をクイックソート (再帰呼出) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

  50. クイックソート 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。 5件のデータ 85 86 92 90 85 左端 left (定数) 右端 right (定数) この区間をクイックソート (再帰呼出) 左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。 ・基準よりも小さい要素は「左側」に移動。 ・基準よりも大きい要素は「右側」に移動。  →左右が逆になっている組み合わせを「入れ替える」!

More Related