質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

356閲覧

C++で以下のプログラムでマージソートのどのようにソートされているか

jaogjig

総合スコア21

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/08/17 19:03

前提

本でマージソートを勉強しています。
そこで整数NとN個の整数A1A2,,,Anを入力してマージソートを行うと書いています。
下コードから見ると、

// A[l], A[l+1], ..., A[r−1] を小さい順に整列する関数 void MergeSort(int l, int r) { // r−l=1 の場合、すでにソートされているので何もしない if (r - l == 1) return; // 2 つに分割した後、小さい配列をソート int m = (l + r) / 2; MergeSort(l, m); MergeSort(m, r); // この時点で以下の 2 つの配列がソートされている: // 列 A' に相当するもの [A[l], A[l+1], ..., A[m−1]] // 列 B' に相当するもの [A[m], A[m+1], ..., A[r−1]]

ここの部分でN=4、A={12、2、3、4}としましたが(1、5)、(1、3)、(1、3)、(1、2)と続くだけで2つの配列がソートされているように思えません。ソートされている理由をご指摘お願いします。

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • マージソートを処理手順を理解したい。

該当のソースコード

#include <iostream> using namespace std; int N, A[200009], C[200009]; // A[l], A[l+1], ..., A[r−1] を小さい順に整列する関数 void MergeSort(int l, int r) { // r−l=1 の場合、すでにソートされているので何もしない if (r - l == 1) return; // 2 つに分割した後、小さい配列をソート int m = (l + r) / 2; MergeSort(l, m); MergeSort(m, r); // この時点で以下の 2 つの配列がソートされている: // 列 A' に相当するもの [A[l], A[l+1], ..., A[m−1]] // 列 B' に相当するもの [A[m], A[m+1], ..., A[r−1]] // 以下が Merge 操作となります。 int c1 = l, c2 = m, cnt = 0; while (c1 != m || c2 != r) { if (c1 == m) { // 列 A' が空の場合 C[cnt] = A[c2]; c2++; } else if (c2 == r) { // 列 B' が空の場合(抜けている部分) C[cnt] = A[c1]; c1++; } else { // そのいずれでもない場合(抜けている部分) if (A[c1] <= A[c2]) { C[cnt] = A[c1]; c1++; } else { C[cnt] = A[c2]; c2++; } } cnt++; } // 列 A', 列 B' を合併した配列 C を A に移す // [C[0], ..., C[cnt−1]] −> [A[l], ..., A[r−1]] for (int i = 0; i < cnt; i++) A[l + i] = C[i]; } int main() { // 入力 cin >> N; for (int i = 1; i <= N; i++) cin >> A[i]; // マージソート → 答えの出力 MergeSort(1, N + 1); for (int i = 1; i <= N; i++) cout << A[i] << endl; return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matukeso

2022/08/17 22:33

>(1、5)、(1、3)、(1、3)、(1、2)と続くだけ これはl,rの値でも表示したんですかね そのときと関数から戻る前のAの値を表示しないと、あんまり意味が無いですね
guest

回答1

0

ベストアンサー

MergeSort の入口と出口でソートする配列の内容を表示してみました。

C++

1void print(int l, int r) 2{ 3 cout << "(" << l << "," << r << ")"; 4 for (int i = l; i < r; i++) cout << ' ' << A[i]; 5 cout << endl; 6} 7 8 void MergeSort(int l, int r) { 9 print(l, r); 10 ... 11 print(l, r); 12 }

実行例

4 (入力) 12 2 3 4 (入力) (1,5) 12 2 3 4 (1,3) 12 2 (1,2) 12 (2,3) 2 (1,3) 2 12 (3,5) 3 4 (3,4) 3 (4,5) 4 (3,5) 3 4 (1,5) 2 3 4 12 2 3 4 12

投稿2022/08/18 00:55

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jaogjig

2022/08/18 09:22

(1、2)=12(2、3)=2から(1,3)=2、12になんでソートされるのでしょうか
kazuma-s

2022/08/18 13:00

12 と 2 をマージするからソートされます。
jaogjig

2022/08/21 19:51

理解しましたありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問