C で文字の配列をアルファソートする最も簡単な方法は何でしょうか?

StackOverflow https://stackoverflow.com/questions/122649

  •  02-07-2019
  •  | 
  •  

質問

C で文字の配列をアルファベット順に並べ替える、シンプルで理解しやすいアルゴリズムを探しています。

役に立ちましたか?

解決

C の文字にはたまたま順序どおりの数値が含まれているため、文字を整数のように扱うだけです。C 標準ライブラリには「qsort」関数が含まれています。それを使ってください(man qsort Linux のようなシステム上)。話を単純化するために大文字を小文字に変換する必要があるかもしれませんが、それは簡単なことではありません。クイックソート アルゴリズムを理解したい場合 (実際に使用するため、学習する必要があります)、を参照してください。 ウィキペディア.

他のヒント

結果が人間を対象とする場合は、strcoll を使用することをお勧めします。strcmp や strcasecmp よりも遅くなりますが、英語以外の文字も考慮されます。これを使用する場合は、LC_COLLATE のロケールを設定することを忘れないでください。

setlocale(LC_COLLATE, "");

qsort メソッドを使用します。

#include <stdlib.h>

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

int main(){
  const char char_array[] = { 'c', 'a', 'b' };

  qsort (char_array, 3, sizeof(char), char_compare);

  return 0;
}

本当にアルゴリズムを探しているのか、それとも単に問題を解決する方法を探しているのでしょうか?後者の場合は、使用します Cのqsort.

アルゴリズムが必要な場合は、 挿入ソート または 選択の並べ替え, 非常にわかりやすいので。

ちょうど試して バブルソート それが最も簡単な並べ替えアルゴリズムです。

簡単?バブルソートを実行します。

これは char ではなく java と int ですが、簡単に適応させることができます。

int[] bubble(int a[])
    {
    for (int i = a.length; --i>=0; )
        {
        for (int j = 0; j<i; j++)
            {
            if (a[j] > a[j+1])
                {
                int T = a[j];
                a[j] = a[j+1];
                a[j+1] = T;
                }
            }
        }
    return(a);
    }

これは非常に単純で、漸近的に最速です (N は配列のサイズです)。

const unsigned char in[N];
unsigned char out[N], *p=out;
size_t cnt[N]={0}, i, j;
for (i=0; i<COUNT; i++) cnt[in[i]]++;
for (i=0; i<256; i++) for (j=cnt[i]; j; j--) *p++=i;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top