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

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

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

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

Q&A

解決済

2回答

500閲覧

マージソート C++

aufheben

総合スコア24

C++

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

0グッド

0クリップ

投稿2018/07/01 16:05

C++でコードを書くのは初めてです。
マージソートを実装したく、下記のコードを書いてみたのですがうまくいきません。
具体的に言うとソートされておらず、入力したままの配列が表示されます。
詳しい方いらっしゃったらご教授お願い致します。

lang

1#include<iostream> 2#include<limits> 3 4void mergeSort(int* A, int left, int right); 5using namespace std; 6int ct=0; 7int main() { 8 int* S; 9 int n; 10 cin >> n; 11 S = new int[n]; 12 for (int i = 0; i < n; i++) { 13 cin >> S[i]; 14 } 15 /*for (int i = 0; i < n; i++) { 16 cout << S[i]; 17 cout << " "; 18 }*/ 19 20 mergeSort(S,S[0],S[n-1]); 21 22 for (int i = 0; i < n-1; i++) { 23 cout << S[i]; 24 cout << " "; 25 } 26 cout << S[n - 1] << endl; 27 cout << ct<<endl; 28} 29 30void merge(int* A ,int left, int mid, int right) { 31 int n1 = mid - left; 32 int n2 = right - mid; 33 int* L; 34 int* R; 35 L = new int[n1]; 36 R = new int[n2]; 37 for (int i = 0; i < n1 - 1; i++) { 38 L[i] = A[left + i]; 39 } 40 for (int i = 0; i < n2 - 1; i++) { 41 R[i] = A[mid + i]; 42 } 43 L[n1] = INFINITY; 44 R[n2] = INFINITY; 45 int i = 0; 46 int j = 0; 47 48 for (int k = left; i < right - 1; i++) { 49 if (L[i] <= R[j]) { 50 A[k] = L[i]; 51 i = i + 1; 52 ct++; 53 } 54 else { 55 A[k] = R[j]; 56 j = j + 1; 57 } 58 } 59} 60 61void mergeSort(int* A, int left, int right) { 62 if (left + 1 < right) { 63 int mid = (left + right) / 2; 64 mergeSort(A, left, mid); 65 mergeSort(A, mid, right); 66 merge(A, left, mid, right); 67 } 68}

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

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

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

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

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

guest

回答2

0

ベストアンサー

mergeSort(S,S[0],S[n-1]);

c++

1 mergeSort(S,0,n-1);

が正しいでしょう。

L = new int[n1];
R = new int[n2];

後にL[n1]およびR[n2]に代入しちゃっているので、それぞれ+1しないといけません。

最後に、newで確保したメモリを解放していないのが気になります。

投稿2018/07/01 23:33

asm

総合スコア15147

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

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

aufheben

2018/07/02 09:07

mergeSortの引数とL=new int[n1+1],R=new int[n2+1]を修正したところ、実行結果が 3 5 -1574969728 2 -572662307 3 0 0 10 4 20 などランダムで変わるようになってしまいました。 動的配列の確保の仕方が間違っているんでしょうか? あとdelete[]はどこに入れればいいんでしょうか? mergeの最後にdelete[]を入れると何も表示されませんでした。
asm

2018/07/02 10:29

結果がランダムになるのは > for (int k = left; i < right - 1; i++) { ここの i < right - 1 およびi++はk < right および k++の間違いですね mergeラストでLおよびRをdelete[]する事が必要です まぁnew/deleteは、言ってしまえば古いC++の習慣です 配列を動的確保したいならvectorを使った方が安全です。 https://qiita.com/asm/items/b27f5f40f51d3fd32fd7 ↑暇だからえせモダンでマージソートを実装するとこうなりましたmergeラストでLおよびRをdelete[]する事が必要です ご質問のコードをバグ取りしたら以下になりました。 デバッグ用のログ出力はそのままにしておきます。 https://wandbox.org/permlink/VBExhh2VrQS00umr
aufheben

2018/07/02 11:28

丁寧な説明ありがとうございました!
guest

0

回答ではないですが、
Windowsを使っているなら、VisualStudioを使ってデバッグしてみてはどうでしょう
ソースコード上の任意の行にブレークポイントを設置し、実行をそこで止め、各変数の内容を参照することができます。
また、1行づつ実行し、変数の内容をモニタするようなこともできます

投稿2018/07/01 22:54

y_waiwai

総合スコア87782

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問