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

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

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

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

3回答

638閲覧

C言語のヒープソートで1つ目がソートされない

Fukada

総合スコア13

C

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2020/06/23 15:40

C言語 ヒープソートについて

ヒープソートをするために以下のようなコードを書きました。

#include<stdio.h> #define MAX_HEAP 10 int a[MAX_HEAP + 1] = {20, 6, 55, 74, 3, 45, 13, 87, 46, 30}; int n = 10; void downheap(int from, int to) { int i, j; int val; val = a[from]; i = from; while(i <= to/2){ j = i * 2; if(j + 1 <= to && a[j] > a[j + 1]){ j++; } if(val <= a[j]){ break; } a[i] = a[j]; i = j; } a[i] = val; } void heapsort() { int i; int tmp; for(i = n/2; i >= 1; i--){ downheap(i, n); } for(i = n; i >= 2; i--){ tmp = a[1]; a[1] = a[i]; a[i] = tmp; downheap(1, i - 1); } } int main(void) { //int a[10] = {20, 6, 55, 74, 3, 45, 13, 87, 46, 30}; int i; heapsort(); for(i = 0; i < 10; i++){ printf("%d ", a[i]); } printf("\n"); return 0; }

そして、出力結果は以下のようにいなりました。

20 87 74 55 46 45 30 13 6 3

ここで1つめの20がソートされないのはなぜでしょうか

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

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

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

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

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

guest

回答3

0

範囲 0~n-1 をソートするよう、小手先の修正を試みた:

C

1#include<stdio.h> 2 3void downheap(int* a, int from, int to) { 4 int i, j; 5 int val; 6 7 val = a[from]; 8 9 i = from; 10 while (i <= to / 2) { 11 j = i * 2; 12 if (j + 1 <= to && a[j] > a[j + 1]) { 13 j++; 14 } 15 16 if (val <= a[j]) { 17 break; 18 } 19 20 a[i] = a[j]; 21 i = j; 22 } 23 a[i] = val; 24} 25 26void heapsort(int* a, int n) { 27 int i; 28 int tmp; 29 --a; 30 for (i = n / 2; i >= 1; i--) { 31 downheap(a, i, n); 32 } 33 34 for (i = n; i >= 2; i--) { 35 tmp = a[1]; 36 a[1] = a[i]; 37 a[i] = tmp; 38 downheap(a, 1, i - 1); 39 } 40} 41 42int main(void) { 43 int a[10] = {20, 6, 55, 74, 3, 45, 13, 87, 46, 30}; 44 int i; 45 46 heapsort(a, 10); 47 for (i = 0; i < 10; i++) { 48 printf("%d ", a[i]); 49 } 50 printf("\n"); 51 52 return 0; 53}

aをいっこ左にズラしただけですけどねwww

投稿2020/06/24 01:31

episteme

総合スコア16612

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

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

0

範囲 1〜n をソートしてるからでしょ、0〜n-1 じゃなく。

投稿2020/06/23 21:03

episteme

総合スコア16612

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

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

0

ベストアンサー

downheap(i, n);

このiは1より小さくはなりません。
配列の0番目の要素はソートの対象にはなりません

投稿2020/06/23 15:48

編集2020/06/23 15:51
y_waiwai

総合スコア88042

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

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

y_waiwai

2020/06/23 15:52

まずはデバッグできる環境を揃えましょう Eclipseや、WindowsならVisualStudioなど。 コードの任意の行で実行を止め、変数の中身を参照できます。 また、そこから1行づつ実行させてコードの流れや変数の変化を見ることができます そうすれば、アテずっぽでコードを書かなくて済むようになり、 なぜ動かないか他人に聞くようなこともしないで済むようになります
Fukada

2020/06/23 15:57

ご回答ありがとうございます ではこれは一応ソート成功と言ってもいいのですか? それともプログラム改良しなければいけないですか?
Fukada

2020/06/23 15:58 編集

すみません2つ目の回答を確認する前に返信してしまいました。 visual studioをインストールしてみることにします
episteme

2020/06/24 01:20

> ではこれは一応ソート成功と言ってもいいのですか? 1~n の範囲についてはソートできてるでしょけど、 Cでは配列は0から始まるので(0~n-1でないと)実用にはちと苦しい...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問