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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

Q&A

解決済

2回答

226閲覧

配列を数値順にするときに、先頭の要素が-1になってしまう

Cacciatello

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

0グッド

0クリップ

投稿2018/02/12 05:25

編集2018/02/12 05:31

前提・実現したいこと

C言語初心者です。配列の要素の数値を順番に並び替えるプログラムを作っています。
(参考書の例題を写したものです)
並び替えたあと最初の要素が必ず-1になってしまいます。一番大きい数値が-1になっていると思われます。ほかの要素は数値順になっています。

発生している問題・エラーメッセージ

ーー実行結果ーー
ソート準備:
5232 26436 4499 31796 18906 6587 6989 12260 8042 7528
ソート開始:

ソート終了:
-1 4499 5232 6587 6989 7528 8042 12260 18906 26436
ーーーーーーーー

C言語(拡張子は.c)

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5#define N 10 //データの件数 6 7 8int sort[N]; 9 10 11void BubbleSort(void){ 12 int i,j,flag; 13 14 do{ 15 flag = 0; 16 for(i=0;i<N;i++){ 17 if(sort[i]>sort[i+1]){ 18 flag = 1; 19 j = sort[i]; 20 sort[i] = sort[i+1]; 21 sort[i+1] = j; 22 } 23 } 24 }while(flag == 1); 25} 26 27 28int main(void){ 29 int i; 30 31 srand((unsigned int)time(NULL)); 32 33 printf("ソート準備:\n"); 34 for(i = 0; i<N; i++){ 35 /*配列にランダムな値を格納*/ 36 sort[i]=rand(); 37 printf("%d ",sort[i]); 38 } 39 40 printf("\nソート開始:\n"); 41 BubbleSort(); 42 43 printf("\nソート終了:\n"); 44 45 for(i=0;i<N;i++){ 46 printf("%d ",sort[i]); 47 } 48 49 return EXIT_SUCCESS; 50} 51

補足情報(FW/ツールのバージョンなど)

Eclipse IDE for C/C++ Developers
Version: Neon.2 Release (4.6.2)

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

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

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

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

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

guest

回答2

0

このソート関数は
sort[i]とsort[i+1]が逆なときに交換しています。

for(i=0;i<N;i++)よりi+1は最大でNになってしまい配列の外側と交換されてしまいます
というわけで正しくはfor(i=0;i<N-1;i++)です

ついでに言うならば変数いっこ増やして

c

1void BubbleSort(void){ 2 int i,j,flag; 3 int jj = 1; 4 do{ 5 flag = 0; 6 for(i=0;i<N-jj;i++){ 7 if(sort[i]>sort[i+1]){ 8 flag = 1; 9 j = sort[i]; 10 sort[i] = sort[i+1]; 11 sort[i+1] = j; 12 } 13 } 14 jj++; 15 }while(flag == 1); 16}

の方がループの回数が減ります

投稿2018/02/12 05:45

asm

総合スコア15147

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

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

Cacciatello

2018/02/12 08:19

回答ありがとうございます! 理解できました!変数jjを足していくということがあまりよくわかりませんが自分で考えてみたいと思います。
guest

0

ベストアンサー

関数BubbleSort内の、下記部分に問題があります。

C

for(i=0;i<N;i++){
if(sort[i]>sort[i+1]){
flag = 1;
j = sort[i];
sort[i] = sort[i+1];
sort[i+1] = j;
}
}

iがN-1のとき、sort[N-1]とsort[N]にアクセスしてしまっています。
後者は配列範囲外へのアクセスになるので、その結果は予想できません。

次のように、ループカウンタiの上限を変更すると良いでしょう。

C

1for(i=0;i<N-1;i++){ 2 if(sort[i]>sort[i+1]){ 3 flag = 1; 4 j = sort[i]; 5 sort[i] = sort[i+1]; 6 sort[i+1] = j; 7 } 8}

投稿2018/02/12 05:35

LouiS0616

総合スコア35660

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

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

Cacciatello

2018/02/12 08:21

回答ありがとうございます! 配列の要素をしっかりfor文で考えられていませんでした。 ちゃんと動くようになりました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問