C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で辞書式順序(辞書順)に文字列をソートする方法

辞書式順序(辞書順)とは

辞書式順序(レキシコグラフィカル・オーダー)とは、単語をアルファベットの順序に従って並べる方法のことです。辞書で言葉が並べられているのと同じ規則で、リスト内の要素を整列させます。例えば、以下のようになります。

単語リスト:
Harry
Adam
Sam

辞書式順序に並べた結果:
Adam
Harry
Sam

この記事では、C++を使って複数の文字列を辞書式順序にソートするプログラムを紹介します。

サンプルプログラム

以下は、ユーザーから入力された5つの文字列を辞書式順序に並べ替えるC++プログラムです。

#include <iostream>
using namespace std;
int main() {
   int i,j;
   string s[5], temp;
   cout<<"Enter the elements..."<<endl;

   for(i = 0; i < 5; ++i)
   getline(cin, s[i]);
   
   for(i = 0; i < 4; ++i)
   for(j = i+1; j < 5; ++j) {
      if(s[i] > s[j]) {
         temp = s[i];
         s[i] = s[j];
         s[j] = temp;
      }
   }
   cout << "The elements in lexicographical order are... " << endl;
   for(int i = 0; i < 5; ++i)
   cout << s[i] << endl;
   return 0;
}

実行結果

上記のプログラムを実行すると、次のような出力が得られます。

Enter the elements…
Orange
Grapes
Mango
Apple
Guava

The elements in lexicographical order are...
Apple
Grapes
Guava
Mango
Orange

入力された「Orange」「Grapes」「Mango」「Apple」「Guava」が、アルファベット順に正しく並べ替えられていることがわかります。

プログラムの解説

1. 文字列の入力

まず、string型の配列 s[5] を定義し、ユーザーから5つの文字列を受け取ります。空白を含む文字列にも対応できるよう、cin ではなく getline を使用している点がポイントです。

string s[5], temp;
cout<<"Enter the elements..."<<endl;
for(i = 0; i < 5; ++i)
getline(cin, s[i]);

2. バブルソートによる並べ替え

次に、二重の for ループ(ネストしたループ)を使って文字列を比較し、必要に応じて入れ替えます。C++では string 型同士を比較演算子(>)で直接比較できるため、辞書式順序での大小判定が簡単に行えます。

for(i = 0; i < 4; ++i)
for(j = i+1; j < 5; ++j) {
   if(s[i] > s[j]) {
      temp = s[i];
      s[i] = s[j];
      s[j] = temp;
   }
}

この処理はバブルソートの一種で、先頭の要素とそれ以降の要素を順番に比較しながら、より小さい(辞書的に前の)文字列を前に移動させていきます。

3. 結果の出力

最後に、並べ替えられたすべての要素を順番に表示します。

cout << "The elements in lexicographical order are... " << endl;
for(int i = 0; i < 5; ++i)
cout << s[i] << endl;

まとめ

C++では、string 型が比較演算子をサポートしているため、数値のソートと同じ要領で文字列を辞書式順序に並べ替えることができます。このプログラムのように二重ループを使った基本的なソート手法を理解しておくと、sort 関数などの標準ライブラリを使う際にも仕組みが把握しやすくなります。

  1. Javaで配列の要素を辞書式順序(辞書順)にソートする方法

    この記事では、Javaで配列の要素を辞書式順序(レキシコグラフィカル順)にソートする方法について解説します。辞書式順序とは、国語辞典などで使われるアルファベット順・五十音順の考え方を、文字列やシーケンス全般に一般化したものです。まず、今回作成するプログラムの入力と出力のイメージを確認しておきましょう。入出力の例入力今回は次のような文字列配列を扱います。Alpha Beta Gamma Delta出力辞書式順序にソートすると、次のようになります。Alpha Beta Delta Gammaアルゴリズムソートの流れは以下の通りです。処理を開始する整数型変数 i、j、array_length を宣言

  2. C++で行列の対角要素を昇順にソートするプログラムの実装方法

    n × m の行列 Mat が与えられたとき、左上から右下へ向かう各対角線(斜め方向)に沿って要素を昇順に並べ替えることを考えます。つまり、すべての対角線上の要素がそれぞれ独立にソートされた状態にします。例えば、次のような入力行列があったとします。331122121112この場合、出力される行列は次のようになります。111112221233解決のためのアプローチこの問題は「同じ対角線上にある要素を一度取り出してソートし、元の位置に書き戻す」というシンプルな発想で解決できます。具体的には、以下の手順に従います。solve() というメソッドを定義します。引数として対角線の開始位置 si、sj と