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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2148閲覧

ランダムな数字が入った配列をBubble Sortで並べ換えるには?(通常の方法と再帰の両方で)

Momomo.

総合スコア22

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2018/02/10 03:48

ランダムに割り出した60個の数字が入ったアレーA[]をBubble sortで並べ換えるプログラムを書いています。

<期待する結果>
・ランダムな数字が入ったアレーを作る
・並べ換える前に1度プリントする(1行6個ずつ)
・アレーをBubble Sortで並べ換える
・それをプリントする
・アレーをBubble Sortで並べる(再帰を使って)
・それをプリントする

<実際の結果>
こちらのスクリーンショットは実際に自分が書いたプログラムをRunした時にプリントされた結果です。
ご覧の通り、1度目にBubble Sortした時に全ての数字が32767となっています。
また、再帰でBubble Sortをした時もまたアレー内の数字が変わっているようです。
イメージ説明

<知りたいこと>
・どうしてこのように最初に割り出した数字と違う数字が1度目と2度目のBubble Sortで使われているのでしょうか?
・最初に割り出したランダムなアレーをBubble Sortで並べ換えるにはどうすれば良いですか?

C++初心者です。よろしければアドバイスよろしくお願いします。

c++

1#include <iostream> 2#include <ctime> 3using namespace std; 4void printUnsortedArray(int A[], int n); 5void bubbbleSort(int A[], int n); 6void bubbbleSort(int A[], int n); 7void swap(int A[], int i, int j); 8void printSortedArray(int A[], int n); 9 10void printUnsortedArray(int A[], int n){ 11 //define count for printing 6 per line 12 int count=0; 13 cout << "The array before sorting" <<endl; 14 for(int i=0; i<n; i++){ 15 //print num in array & space between each num 16 cout << A[i] <<" "; 17 count++; 18 //print new line after printing 6 nums 19 if(count==6){ 20 count=0; 21 cout << endl; 22 } 23 } 24 cout << "\n"; 25} 26 27void bubbbleSort(int A[], int n){ 28 int i,j; 29 for(i=0; i<n-1; i++){ 30 for(j=0; j<n-1; j++){ 31 if(A[j]>A[j+1]) 32 swap(A,i,i+1); 33 } 34 } 35} 36 37void bubbleSortRec(int A[], int n){ 38 int i; 39 for(i=0; i<n-1; i++){ 40 if(A[i]>A[i+1]) 41 swap(A,i,i+1); 42 } 43 if(n-1>1) 44 bubbleSortRec(A,n-1); 45} 46 47void swap(int A[], int i, int j){ 48 int tmp; 49 A[i]=A[j]; 50 A[j]=tmp; 51} 52 53void printSortedArray(int A[], int n){ 54 //define count for printing 6 per line 55 int count=0; 56 cout << "The array after sorting" <<endl; 57 for(int i=0; i<n; i++){ 58 //print num in array & space between each num 59 cout << A[i] <<" "; 60 count++; 61 //print new line after printing 6 nums 62 if(count==6){ 63 count=0; 64 cout << endl; 65 } 66 } 67 cout << "\n"; 68} 69 70int main(){ 71 //create array 72 int A[60]; 73 srand(time(NULL)); 74 75 for(int i=0; i<sizeof(A); i++) 76 A[i]=rand()%100; 77 78 int n=sizeof(A)/sizeof(A[0]); 79 80 //call functions 81 printUnsortedArray(A,n); 82 bubbbleSort(A,n); 83 printSortedArray(A,n); 84 bubbleSortRec(A,n); 85 printSortedArray(A,n); 86 87 return 0; 88 89} 90

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

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

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

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

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

guest

回答2

0

ベストアンサー

注意力散漫。

C++

1void bubbbleSort(int A[], int n){ 2 int i,j; 3 for(i=0; i<n-1; i++){ 4 for(j=0; j<n-1; j++){ 5 if(A[j]>A[j+1]) 6// まちがい swap(A,i,i+1); 7 swap(A,j,j+1); 8 } 9 } 10}

C++

1void swap(int A[], int i, int j){ 2// int tmp; // <= 初期化してねぇし 3 int tmp = A[i]; 4 A[i]=A[j]; 5 A[j]=tmp; 6}

C++

1/* まちがい 2 for(int i=0; i<sizeof(A); i++) 3 A[i]=rand()%100; 4 5 int n=sizeof(A)/sizeof(A[0]); 6*/ 7 int n=sizeof(A)/sizeof(A[0]); 8 for(int i=0; i<n; i++) 9 A[i]=rand()%100;

投稿2018/02/10 04:08

編集2018/02/10 04:10
episteme

総合スコア16614

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

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

Momomo.

2018/02/10 04:23

マイナーなミスばかりですね>< swapのtmpを直した後にプログラムを動かしてもbubbleSortの部分が並べ替えられず困っていました。 swap(A, j, j+1)のjところがiになっていたからなんですね。 疑問が全て解決しました。迅速なお答えありがとうございました!
episteme

2018/02/10 05:34 編集

デバッグの仕方を学びなさい。 あとバブルソートの効率が悪い。loopまわしすぎ。
guest

0

swap関数の実装がおかしいです。

C

1void swap(int A[], int i, int j){ 2 int tmp; 3 A[i]=A[j]; 4 A[j]=tmp; 5}

ここでtmpに何も代入していないため、A[j]に正しい値が入りません。

投稿2018/02/10 04:03

maisumakun

総合スコア145184

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

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

Momomo.

2018/02/10 04:24

見逃していました! tmp=A[i]にすることで解決しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問