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

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

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

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

解決済

1回答

979閲覧

シェルソート(降順)の作成

Asahi_1115

総合スコア13

C

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

1クリップ

投稿2018/01/15 08:27

編集2018/01/15 10:19

シェルソート(降順)でソートした数の
先頭5個と末尾5個を表示したいのですが望むような結果になりません。
ご指摘お願いします。

データ数=5
1
5
3
4
2
1,5,3,4,2
1,5,3,4,2

#include <stdio.h> #include <stdlib.h> int shell(int *D, int n) { int i,j,x,gap; gap = n/2; while(gap > 0) { for(i=1; i<n; i++) { x = D[i]; j = i; while((D[j-gap] < x) && (j >0)) { D[j] = D[j-gap]; j--; } D[j]=x; gap = gap / 2; } } } int main() { int n=0,a=0; int *D; printf("データ数="); scanf("%d",&n); D = (int*)malloc(sizeof(int)*n); for(a=0; a<n; a++) { scanf("%d",&D[a]); } shell(D,n); printf("%d,%d,%d,%d,%d\n",D[0],D[1],D[2],D[3],D[4]); printf("%d,%d,%d,%d,%d\n",D[n-5],D[n-4],D[n-3],D[n-2],D[n-1]); free(D); return 0; }

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

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

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

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

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

guest

回答1

0

ベストアンサー

少なくともwhile(gap < 0)だと一度も条件を満たしそうにないですね。
比較演算子の向きが逆なのではないでしょうか。

追記

組んでみました。元のコードからかけ離れていますし、Cですけれど。

C

1// Warning : It's NOT sort function. 2int *insert_n(int *arr, size_t len, size_t gap) { 3 for(size_t i = gap; i < len; i += gap) { 4 if(arr[i-gap] <= arr[i]) continue; 5 6 for(size_t j = 0; j < i; j += gap) { 7 if(arr[j] <= arr[i]) continue; 8 9 int tmp = arr[j]; 10 arr[j] = arr[i]; 11 arr[i] = tmp; 12 } 13 } 14 return arr; 15} 16 17// Sort functions 18int *insert_sort(int *arr, size_t len) { 19 return insert_n(arr, len, 1); 20} 21int *shell_sort(int *arr, size_t len) { 22 for(size_t gap = len/2; gap > 0; gap /= 2) { 23 insert_n(arr, len, gap); 24 } 25 return arr; 26}

ちなみにこれは昇順に並び替えるコードです。
しっかり理解すれば、どこを書き換えて降順にするかはすぐわかるかと思います。

比較関数を渡すようにするともっとそれっぽくなりそうですね。


C++らしく書きたいのでしたら、まず配列を捨てstd::vectorstd::arrayに乗り換えてください。
スマートポインタと参照を適宜使えば生ポインタも捨てられます。
さらに、stdio.h系関数ではなくiostreamを使えると良いですね。

投稿2018/01/15 08:32

編集2018/01/15 09:58
LouiS0616

総合スコア35660

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

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

Asahi_1115

2018/01/15 08:41

ご指摘ありがとうございます。 書き直して再度実行しましたが、まだ結果が思わしくありません。 ほかの部分にも不備が無いかご指摘いただけるとありがたいです。
LouiS0616

2018/01/15 09:22

あと、ご提示のコードはとてもC++には見えません(動きはしますけど) いっそのことCタグに変更してみてはいかがでしょうか。
Asahi_1115

2018/01/15 10:28

gap = gap / 2;の場所をforのすぐに下に入れたら降順に出力されました!たくさんご助力いただき、ありがとうございます!とても助かりました! Cタグのつもりがc++になってたようです(^^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問