ページ 11

複数の文字列を含む文字列におけるソート

Posted: 2012年10月09日(火) 22:26
by Temp
char szNames[] = "Hokkaido\0Saga\0Aichi\0Wakayama\0Shizuoka\0\0";



"Aichi\0Hokkaido\0Saga\0Shizuoka\0Wakayama\0\0"

というようにアルファベット順に並び替える C 関数を書くにはどうすればよいでしょうか?

Re: 複数の文字列を含む文字列におけるソート

Posted: 2012年10月09日(火) 22:58
by softya(ソフト屋)
フォーラムルールをご覧頂きたいのですが、質問の書き方が良くわからない場合はテンプレートをお使いください。
http://dixq.net/board/board.html

Re: 複数の文字列を含む文字列におけるソート

Posted: 2012年10月10日(水) 08:51
by non
int ten[]={6,3,5,4,2,0};
のような数字のソートは作れますか?

Re: 複数の文字列を含む文字列におけるソート

Posted: 2012年10月10日(水) 17:47
by Temp
non さんが書きました:int ten[]={6,3,5,4,2,0};
のような数字のソートは作れますか?
int のソートは以下のコードでできました。

void sort(int numbers[], int count)
{
int i, j, temp;
for(i = 1; i < count; ++i)
{
for (j = count - 1; j >= i; --j)
{
if(numbers[j - 1] > numbers[j])
{
temp = numbers[j - 1];
numbers[j - 1] = numbers[j];
numbers[j] = temp;
}
}
}
}

Re: 複数の文字列を含む文字列におけるソート

Posted: 2012年10月10日(水) 20:06
by non
では次に、
char *str[] = {"Hokkaido","Saga","Aichi","Wakayama","Shizuoka",""};
だとしたら、ソートできますか?

プログラムを載せるときはコードタグで囲ってね。

Re: 複数の文字列を含む文字列におけるソート

Posted: 2012年10月10日(水) 20:42
by Temp
non さんが書きました:では次に、
char *str[] = {"Hokkaido","Saga","Aichi","Wakayama","Shizuoka",""};
だとしたら、ソートできますか?

プログラムを載せるときはコードタグで囲ってね。

コード:


void sortNames(char *names[], int count)
{
	int i, j;
	char *pTemp;
	for(i = 0; i < count; i++)
	{
		for (j = i + 1; j < count; j++)
		{
			if (stricmp(names[i], names[j]) > 0)
			{
				pTemp = names[i];
				names[i] = names[j];
				names[j] = pTemp;
			}
		}
	}
}

でできました。

Re: 複数の文字列を含む文字列におけるソート

Posted: 2012年10月11日(木) 11:39
by non
それでは、次に
char szNames[] = "Hokkaido\0Saga\0Aichi\0Wakayama\0Shizuoka\0\0";
から、おのおのの文字列の先頭アドレスをみつけ、char *str[6] に格納する
プログラムを作りましょう。
なお、ここでは文字列の個数が5個までとしています。str[6]にしているのは
終わりの合図用です。

Re: 複数の文字列を含む文字列におけるソート

Posted: 2012年10月18日(木) 23:57
by かずま
一週間以上経ちましたが、進展がないようですね。

さて、入力のサイズに応じて、必要なメモリーが増えるのが普通のアルゴリズム
ですが、どんなに時間がかかってもよいから、ごく少量のメモリだけで、目的を
達成するそんなプログラムを考えてみました。

コード:

#include <string.h>  // strlen, strcmp

void rev(char *s, int n)
{
    int c, i;
    for (i = 0; i < --n; i++) c = s[i], s[i] = s[n], s[n] = c;
}

void sort(char *s)
{
    int m, n;
    for (; *s; s += strlen(s) + 1)
        for (m = strlen(s) + 1; (n = strlen(s + m) + 1) > 1; m += n)
            if (strcmp(s, s + m) > 0)
                rev(s, m), rev(s + m, n), rev(s, m + n);
}
テストプログラムは、次の通りです。

コード:

#include <stdio.h>

void print(const char *s)
{
    for (; *s; s++) {
        for (; *s; s++) putchar(*s);
        putchar(' ');
    }
    putchar('\n');
}

int main(void)
{
    char szNames[] ="Hokkaido\0Saga\0Aichi\0Wakayama\0Shizuoka\0\0";
    print(szNames);
    sort(szNames);
    print(szNames);
    return 0;
}