2011-09-12 3 views
2

私のプログラムを実行するにはqsortの機能が必要ですが、これまでのところ仕事をしていません。qsortの動作の解読

私は配列を繰り返し処理して各属性の数を決定できるように、それらをグループにまとめるために基本的に1文字の値の配列をソートしています。私の問題は

xxxxxbxbbbxfbxfbffffbxfxbbfbbbxxfxbxxfbbbbxbfxbxfbxbsxbbbxxbbxxffxbxfxfxbxxbxxfbbbfbxbbx 
bbbsxfxbxbxxbfbfxbxxbxxbfxxbxsbfxxfxfxfffxbfxffbbfffsxsfbfbxbxbbbxxsbfbfbbbbbbxxfxfxffxf 
xbxxbxfxbfbxbxxbxbxxbxbbffxxbxxffxxbxfxbxffxfsfxxfxxfxxfxfxxfxxbsxxbbbxsxxbbxxxbxfxsbxxx 
ffbxfxxffbxxxfxxfxxfxfxxfffbxxxbxxxfffxsbbfffffxxxbbfxsbffxbxxfxbxxfbbfsbffsfffxfxfxbbffx 
bxxfxbxxfxbbbfxxbbfxxbbbsxbxfbfbbxxbbfffxxfxxbbbfxxbxxxbbxxxbfxffxxxffxfxxffbxfsxbxxxfxfx 
fsbbbxxxbfxfffsfxxxfssxxxfxfxxxxbxbbbxxbxxxxxxxxxxxxxxxxxxxfbfxxffxxbxxxxxxxsxsxxxxxxxxsxb 
bxxxxxfxbxxxxfxxfxxxxxbbxfffbxbsxffbbbxsfbbfffbxbfbbxxbxxbbxxbffxfxxfxfbbxxbxfxxsfxxfxxbxf 
xxbxxxbxbxbbxbbffxxxxbfbfxxxxxxfxffxxxxxxxxxxxxxxxxxxxxxbxffxbxbxbbxbbxxfbxfxbxxbxxbxbxxxb 
xxbxbxbfbbffffffsbbxxbffbxfxxfxbfbfffsxbxxxsxxbbbbbxxxbxxxfxxfffxxxxxxxxxxxxxfxxbxxxxxxxxx 
xxbfbxxxxxxxxxxxxxxxxxxxxxxxxxxbxbxxxxxfxxbxxxxffxbxxxxffxfbfffxbxxfxbfxbxxfxbxbfxxxxxfxbx 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsbxxxxffxfxxxxxxxxxfxfxxxbffffxxxfbxbxfxxxxxxxxxxxxxxxxxxxxf 
fxfxbfxxxfxxxxx 

として「ソート」配列を返す私は、問題はどちらか私の関数呼び出しや比較方法に関係していると思われるのqsortです。

int compare(const void *a, const void *b){ 
    return *(char * const *) a - *(char * const *) b; 
} 

tempは、上記文字の配列であり、 lineCountは、アレイ内の文字の数である
qsort(temp, lineCount, sizeof(char), compare); 

に使用されます。配列の完全性とサイズの両方がテストを通じて検証されています。

ご協力いただきまして誠にありがとうございます。

答えて

5

char * const *は、charへのポインタへのポインタです。あなたは単にcharへのポインタを必要とします。

試してみてください。

int compare(const void *a, const void *b){ 
    return *(const char *) a - *(const char *) b; 
} 

また、sizeof(char)は、定義によって、常に1に等しいです。だから、Cプログラマの中にはそういうものを書かない人もいるでしょう。 (これは、コードを読みやすくするか、実際には言語を知らないことだけを伝えるかの意見です。このケースでは好きですが、FYIを参照してください)

+1

私はむしろタイプが変わると 'sizeof * temp'と表示されますが、私は月の位相などによって生の1を使います。 –

1

少なくとも、私はもう少し明確にし、ライン・バイ・ラインより簡単にデバッグのための比較記述します

int compare(const void *a, const void *b) 
{ 
    char* alpha = (char*)a; // Might get const-warning on these lines, ignore for now. 
    char* beta = (char*)b; 

    if (*alpha == *beta) return 0; 
    if (*alpha < *beta) return -1; 
    return 1; 
} 

この道を、あなたは、より簡単にデバッガでそれを見出力ラインを追加し、一般的に問題を打破することができます。

もう一度動作したら、1つのコンパクトなコードに再結合することができます。

int compare(const void *a, const void *b){ 
    return *(const char *) a - *(const char *) b; 
} 

をしかし、私見、あなたはまったくqsortを必要としない:

1

これを試してみてください!

ジャスト[256](または多分それ以下)int型のテーブルを作成し、各文字の数を記録するために、配列を反復:

int res[256]; 
memset(res, 0, 256*sizeof(int)); 
int i; 
for (i=0;i<lineCount;i++){ 
    res[tmp[i]]++; 
} 

これは、qソートのO(NlogN)対O(N)を提供します。