2016-12-07 15 views
1

基数ソートを使って文字列をソートするプログラム(正確な長さは7文字)を作らなければなりません。私は既に各列を別々にソートする関数を作っています。私の問題は、1つの文字だけでなく、文字列全体を移動させる方法です。私が実際にC言語でどのように動作すべきかを知るには本当に問題があります。基数ソート中に文字列を貼り付けるには?

私は1つの配列 "char strings [3] [8]"と "char output [3] [8]"を作成して、それぞれ7文字。例えば、これらの文字列を並べ替え:出力で

strcpy(strings[0], "kupbars"); 
strcpy(strings[1], "daparba"); 
strcpy(strings[2], "jykaxaw"); 

は私が取得:

dakaaaa 
juparbs 
kypbxrw 

各列が正しくソートされますが、文字が一緒に固執しないでください。私は3時間何度も試してみましたが、何もできません。

私のコードは次のようになります。

void countingSort(char a[][8], char b[][8]) { 
    int c[123]; 
    for (int pos = 6; pos >= 0; pos--) { 
    for (int i = 0; i < 123; i++) 
     c[i] = 0; 
    for (int i = 0; i < 3; i++) 
     c[(int)a[i][pos]]++; 
    for (int i = 1; i < 123; i++) 
     c[i] += c[i - 1]; 
    for (int i = 2; i >= 0; i--) { 
     b[--c[(int)a[i][pos]]][pos] = a[i][pos]; 
    } 
    } 
} 

(。それは変数にそれを変更するのは簡単ですので、文字列の長さなどを制限する定数があります - 私はちょうど適切にこのプログラムの仕事を得ることに焦点を当てた)

+0

、私はそれは通常、全体の文字列へのポインタを持つことになり、各桁のバケットのリンクリストで実装だと信じています。 (より複雑なデータ構造が必要ですが、その場で行うのは難しいです) – qxz

答えて

1

文字列全体を移動するためにループを変更してみてください:

for (int i = 2; i >= 0; i--) { 
     int k = --c[(int)a[i][pos]]; 
     for(int j = 0; j < 8; j++) { 
      b[k][j] = a[i][j]; 
     } 
    } 
+0

ありがとう、それは動作します! :)おそらく他のユーザーからの提案もうまくいくかもしれませんが、私のためにあなたのことを理解するのが最も簡単です – lemka8

+0

内部のforループはmemcpy()やmemmove()で置き換えることができますが、 – rcgldr

+0

@ lemka8心配しないで、この回答は良いです。私はrcgldrのように答えましたが、私の極限は関数ごとに2つの 'for'ループです。だから私はあなたのコードを取っておらず、あなたに「クリーナー」のソリューションを提案しています。後で私を試してみることをためらってください。あなたはCで書いて欲しい場合は、ポインタを理解する必要があります。ところで、オーバーフローをスタックに歓迎し、それは良い質問だった。 – Stargateur

0

あなたは循環リストを行うことができますが、それは少しオーバーヘッドです。私はmemmove()を使用するように提案します。

#include <string.h> 

void array_move_forward(char array[3][8]) { 
    for (int i = 0; i < 3; i++) { 
    char tmp = array[i][6]; 
    memmove(array[i] + 1, array[i], 6); 
    array[i][0] = tmp; 
    } 
} 

void array_move_rewind(char array[3][8]) { 
    for (int i = 0; i < 3; i++) { 
    char tmp = array[i][0]; 
    memmove(array[i], array[i] + 1, 6); 
    array[i][6] = tmp; 
    } 
} 

他の解決策は、自分の文字列を自分で操作し、インデックスを使用して文字列の最初の文字を示すことです。それと

{ 
    char str[7]; 
    int i = 0; 
    ... 
    int j = i; 
    for (int k = 0; k < 7; k++) { 
    char tmp = str[j++ % 7]; 
    } 
} 

あなただけi++i--であなたの文字列を回転させることができます。

struct my_string_radix { 
    char str[7]; 
    int begin; 
} 
関連する問題