2017-12-25 10 views
-3

2次配列を辞書順に並べ替えたい。2次元文字配列を辞書順にソートするには?

は、与えられた2次元配列が、私はこの問題を解決する得ることができるように

ebacd 
fghij 
olmkn 
trpqs 
xywuv 

今すぐ配列2D配列が

abcde 
fghij 
klmno 
pqrst 
uvwxy 

なります辞書順にそれを配置した後、私のロジックを提供してくださいあるとし。与えられた配列の行と列の数は同じになります。

+0

これは既に辞書順にソートされています。私はあなたが欲しいものを手に入れません – coderredoc

+0

私は、配列が水平方向にも垂直方向にもソートされることを望みます。 – SB56

+2

私はこの質問を「話題になる」と「私の仕事をしてくれるから」と議論しています。 – EJoshuaS

答えて

1

は、最初の26個の素数を格納します。 は行列の各文字に対してm = 1 となります。mには素数[文字]を掛けます。 今度は行列を順番に通り、mを第1の素数で割って2で割り切れなくなるまで( 'a'を続けて)、mがもはや3で割り切れるまで 'b'を加え続けます。 。

+0

これは単なる答えです。 qsort()も素晴らしいでしょう。 –

0

次の2つの機能を比較定義することができ、一方は水平線は、比較のためであり、他の一つはのためにある垂直比較:のように、まず、ループ内の各列をソート

typedef char Row[COLUMNS]; 
int compareVertical(const void *a, const void *b) 
{ 
    return (*(Row *)a)[0] - (*(Row *)b)[0]; 
} 

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

および列を並べ替えますこの:

qsort(arr, ROWS, sizeof(Row), compareVertical); 

for (int row = 0; row < ROWS; ++row) 
{ 
    qsort(arr[row], COLUMNS, sizeof(char), compareHorizon); 
} 

ここで完全なコードを確認してください:https://ideone.com/b7rvQh

+0

2つの比較関数が必要なのはなぜですか? 1つはうまく動作します。縦の場合、配列へのポインタを間接参照すると、最初の要素が取得されます。 'char * str =" abc "; putchar(* str); '(' a'を出力します)。どうして? 'str [0]'が '*(str + 0)'であれば '*(str)'は '* str'です。 –

+0

いいえ、関数のパラメータはまったく異なる型です。 'compareVertical'の' a'は 'COLUMNS'文字の配列へのポインタです。 'compareHorizo​​n'の' a'は 'COLUMNS'文字の配列の最初の要素である文字へのポインタです。はい、あなたは 'char *'にそれらをキャストすることができますが、IMHO、この質問では明確ではありません。 – pezy

+0

これで、単一の文字の倍数があると考えられる場合、それは適用されません。記述された垂直はテスト入力に基づいていました。その場合、完全な垂直ソートのために '5' char配列要素を完全に比較しなければなりません。あなたが言っていることを知り、同意する。私はサンタが午前中に来た後に更新を削除します。 –

1

この問題は、必要以上に難しくなっている可能性があります。 5の配列がそれぞれ5文字あります。 5文字の配列ごとにqsortを1回呼び出して並べ替えてください。

: -

#include <stdio.h> 
#include <stdlib.h> 

/* integer comparison (adapt for all numeric types) */ 
int cmpint (const void *a, const void *b) 
{ 
    /* (a > b) - (a < b) */ 
    return (*(char *)a > *(char *)b) - (*(char *)a < *(char *)b); 
} 

int main (void) { 

    char a[][5] = { "ebacd", 
        "fghij", 
        "olmkn", 
        "trpqs", 
        "xywuv"}; 
    int n = sizeof a/sizeof *a; 

    for (int i = 0; i < n; i++) 
     qsort (a[i], 5, sizeof *a[i], cmpint); 

    for (int i = 0; i < n; i++) { 
     printf ("a[%d] : ", i); 
     for (int j = 0; j < 5; j++) 
      putchar (a[i][j]); 
     putchar ('\n'); 
    } 

    return 0; 
} 

使用例/出力

$ ./bin/qsort2dchar 
a[0] : abcde 
a[1] : fghij 
a[2] : klmno 
a[3] : pqrst 
a[4] : uvwxy 

編集ごとのコメント水平&垂直ソート

は厄介なアップミックス配列で始まるのをしてみましょう

char a[][5] = { "ebacd", 
        "trpqs", 
        "olmkn", 
        "fghij", 
        "xywuv"}; 

今度はそれをすべて整理してqsort 1以上を追加してみましょう:

#include <stdio.h> 
#include <stdlib.h> 

/* integer comparison (adapt for all numeric types) */ 
int cmpint (const void *a, const void *b) 
{ 
    /* (a > b) - (a < b) */ 
    return (*(char *)a > *(char *)b) - (*(char *)a < *(char *)b); 
} 

int main (void) { 

    char a[][5] = { "ebacd", 
        "trpqs", 
        "olmkn", 
        "fghij", 
        "xywuv"}; 
    int n = sizeof a/sizeof *a; 

    for (int i = 0; i < n; i++)   /* sort horizontal */ 
     qsort (a[i], 5, sizeof *a[i], cmpint); 

    qsort (a, 5, sizeof *a, cmpint); /* sort vertical */ 

    for (int i = 0; i < n; i++) { 
     printf ("a[%d] : ", i); 
     for (int j = 0; j < 5; j++) 
      putchar (a[i][j]); 
     putchar ('\n'); 
    } 

    return 0; 
} 

使用例/出力

$ ./bin/qsort2dchar 
a[0] : abcde 
a[1] : fghij 
a[2] : klmno 
a[3] : pqrst 
a[4] : uvwxy 

全字句ソート可能な文字の複数の発生の場合

コメントで指摘したように、文字のユニークな出現を含む5の各配列の代わりに、配列に重複する文字(個々の配列内または行間のいずれか)が含まれている可能性があります。最初の文字だけでは垂直方向の並べ替えには不十分です。

各文字を検査し、最初の不一致に基づいて返す2番目の比較を追加するか、または比較する行の間ですべての文字が同一である場合にゼロを返すと、コンテンツにかかわらず配列を完全に辞書的に並べ替えることができます。以下は、同じ目的を達成するためにcmpnchr関数を追加しています。

は、入力配列を考えてみましょう:

char a[][NCHR] = { "ebaca", 
         "traqb", 
         "olmkn", 
         "facib", 
         "xywuv"}; 

完全なソートが必要になります。

#include <stdio.h> 
#include <stdlib.h> 

#define NCHR 5 

/* integer comparison (adapt for all numeric types) */ 
int cmpint (const void *a, const void *b) 
{ 
    /* (a > b) - (a < b) */ 
    return (*(char *)a > *(char *)b) - (*(char *)a < *(char *)b); 
} 

int cmpnchr (const void *a, const void *b) 
{ 
    const char *pa = a, 
       *pb = b; 
    int i = 0; 

    for (; i < NCHR; i++) 
     if (pa[i] > pb[i]) 
      return 1; 
     else if (pa[i] < pb[i]) 
      return -1; 

    return 0; 
} 

int main (void) { 

    char a[][NCHR] = { "ebaca", 
         "traqb", 
         "olmkn", 
         "facib", 
         "xywuv"}; 
    int n = sizeof a/sizeof *a; 

    for (int i = 0; i < n; i++)   /* sort horizontal */ 
     qsort (a[i], NCHR, sizeof *a[i], cmpint); 

    qsort (a, NCHR, sizeof *a, cmpnchr); /* vertical sort */ 

    for (int i = 0; i < n; i++) { 
     printf ("a[%d] : ", i); 
     for (int j = 0; j < NCHR; j++) 
      putchar (a[i][j]); 
     putchar ('\n'); 
    } 

    return 0; 
} 

使用例/出力

$ ./bin/qsort2dcharfull 
a[0] : aabce 
a[1] : abcfi 
a[2] : abqrt 
a[3] : klmno 
a[4] : uvwxy 

それ以上の追加がある場合、彼らは朝まで待たなければならないでしょう:)

+0

完全を期すために、*降順*の順序でソートする場合は、比較を '(a < b) - (a > b)'として書き直してください。 –