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

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

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

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

Q&A

解決済

3回答

1975閲覧

シェルソート

life

総合スコア11

C

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

0グッド

1クリップ

投稿2016/10/06 03:31

c言語でシェルソートを作っているのですが、
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern int tableindex;
extern int mycompare(int,int);
extern int myswap(int,int);

void mysort(){
int h,i,j;
int enum=tableindex;

for(h=1; h<enum/9; h=h*3+1)
;
for(; h>0; h=/3){
for(int i=h; i<enum; i++){
j=i;
while(j>=h&&mycompare(j-h,j)>0){
myswap(j-1,j);
j-=h;
}
}
}
}

というプログラムです
mycompareは隣どおしを比べ、myswapは交換するもので、別のプログラムで用意しています。enumは要素数です。

これを1093,364,121,40,13,4,1を数字順にソートしようとしたところ
1,1093,121,13,364,4,40となりおかしくなりました。
これはプログラムがおかしいのか、シェルソートの欠陥部分なのかよくわからなくて困っています
どなたか御指南よろしくお願いします

mycompareの中身は
int mycompare(int i,int j){
int r;
r=strcmp(a[i],a[j]);
return r;
}
であり、a[]はchar型です
データの定義は特にありません
自分で入力できるようにしています

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

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

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

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

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

回答3

0

サラッとしか見てませんが気づいた点。
char型はunsignedでも0~255までしか格納できません。
またstrcmpは文字列の比較であって、数値の比較はできません。
またfor(; h>0; h=/3){内でh=/3となっていますが、h/=3ではないですか?

投稿2016/10/06 03:56

ttyp03

総合スコア16998

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

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

life

2016/10/06 04:49

そうですね、h/=3です。打ち間違えました。
guest

0

ベストアンサー

いままでバブルソートばかりでしたので提供ソースを参考にシェルソート作成してみました。早いです。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4int cnt[] = {1093,364,121,40,13,4,1}; 5int siz = (sizeof cnt)/(sizeof(int)); 6 7void myswap(int a[], int i, int j){ 8 int k; 9 k = a[j]; 10 a[j] = a[i]; 11 a[i] = k; 12} 13 14int mycompare(int a[], int i, int j){ 15 return (a[i] > a[j]); 16} 17 18void mysort(int nums[], int tableindex){ 19 int h,i,j; 20 int xnum=tableindex; 21 for(h=1; h<xnum/9; h=h*3+1) 22 ; 23 for(; h>0; h/=3){ 24 for(i=h; i<xnum; i++){ 25 j=i; 26 while(j>=h && mycompare(nums, j-h,j)){ 27 myswap(nums, j-1,j); 28 j-=h; 29 } 30 } 31 } 32} 33int main(void){ 34 int i; 35 mysort(cnt, siz); 36 for (i=0; i<siz; i++){ 37 printf ("%d,",cnt[i]); 38 } 39 printf("\n"); 40 return 0; 41}

投稿2016/10/06 07:14

A.Ichi

総合スコア4070

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

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

0

strcmpは、文字列の比較であって、文字列を数字値変換してから比較するものではありません。

文字(文字コード)の順序は、
"" < "0" < "1" < "2" < "3" < "4" < "5" < "6" < "7" < "8" < "9"
ですから、strcmpをつかって比較を行うと
「1,1093,121,13,364,4,40」という結果が得られて当然です。

int r;

int r, i1, i2;
に変更し、

r=strcmp(a[i],a[j]);
の行を以下のコードに換えれば、文字列を数値に変更してソートするコードになります。

// 文字列を数値に変換して比較するように変更するため、r=strcmp(a[i],a[j]); を置き換えるコード i1 = atoi(a[i]); i2 = atoi(a[j]); if (i1>i2) { r = 1; } else if (i1=i2) { r = 0; } else { r = -1; }

投稿2016/10/06 04:54

coco_bauer

総合スコア6915

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問