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

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

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

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

C++

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

Q&A

解決済

4回答

2248閲覧

シェルソートを作ってるのですが、難しいです。

Gogetsu_azusa

総合スコア13

ソート

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

C++

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

0グッド

0クリップ

投稿2015/11/18 15:26

シェルソートを作っていて、なかなかうまくできません。
Let's sortとafterの間以外は問題ないと思ってます。
何か気づいた点不審な点あったら教えてください。
お願いします。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 8 /数字の数。2^nに限る。/

void swap(int *a,int *b)/2つの値を入れ替える関数/
{
int temp;

temp=*a; *a=*b; *b=temp;

}

void show(int box[],int n)/配列の中身をn個表示する関数/
{
int num;
for (num = 0; num<n; num++)
{
printf("%3d,", box[num]);
}
printf("\n");
}

void shuttle(int box[],int num)/挿入ソートを行う関数/
{
while ((num > 0) && (box[num-1] > box[num]))
{
swap(&box[num],&box[num-1]);
/show(box);/
num--;
}
}

int main(void)
{
int h,i,j;
int box[N];
int subbox[N];
int num

srand((unsigned)time(NULL)); printf("---before---\n"); for (num = 0; num<N; num++) { box[num] = (rand() % 500)+1; } show(box,N); printf("---Let's sort---\n"); for(h=N/2;h>0;h/=2) { for(j=0;j<h;j++) { for(i=j;i<N;i=i+h) { subbox[i/h]=box[i]; shuttle(subbox,i/h); box[i]=subbox[i/h]; show(subbox,N/h); } } } printf("---after---\n"); show(box,N); return(0);

}

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

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

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

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

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

guest

回答4

0

こんにちは。

シェルソートのことは知らなかったのですが、ググったら面白い解説がありました。
この踊る人たちの動きと比べると、iのループは本当にループを回すべきでしょうか?

投稿2015/11/19 00:37

Chironian

総合スコア23272

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

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

0

てか、
for(i=j;i<N;i=i+h)
{
k=box[i];
box[i/h]=box[i];
box[i/h]=k;
}
でいいですね。shuttleもswapもいりません。

投稿2015/11/18 20:27

maiko0318

総合スコア876

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

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

maiko0318

2015/11/18 21:41

これは間違いです。無視してください。
guest

0

答えが出ました。

for(i=j;i<N;i=i+h) { subbox[i/h]=box[i]; shuttle(subbox,i/h); box[i]=subbox[i/h]; show(subbox,N/h); }

ではなく、
for(i=j;i<N;i=i+h) subbox[i/h]=box[i];
for(i=j;i<N;i=i+h) shuttle(subbox,i/h);
for(i=j;i<N;i=i+h) box[i]=subbox[i/h];

ですね。

投稿2015/11/18 19:45

maiko0318

総合スコア876

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

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

0

ベストアンサー

答えを教えてもらうのではなくて、各所にprintを配置して期待通りの値が入っているかを確認しましょう。
プログラマーの仕事はここからですよ。

投稿2015/11/18 18:27

maiko0318

総合スコア876

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

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

Gogetsu_azusa

2015/11/19 07:29

解答ありがとうございました。うまく動きました。 たしかに仰る通りで、自分で考えて作ることが大事なのはわかるんですが、やはり苦手は苦手なので… あとは、ほかの部分でいろいろ自分で工夫してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問