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

選択ソートを使って日付を並べ替えるC++プログラムの書き方と解説

日付は「日・月・年」の数値の組み合わせで表され、その表示形式にもさまざまなものがあります。

本記事では、選択ソート(セレクションソート)を用いて日付を並べ替えるC++プログラムを紹介します。まずは、この概念に関わる基本的なポイントから見ていきましょう。

日付のソートとは

日付を正しくソートするには、日付の仕組みと妥当性(バリデーション)に関する確かな知識が必要です。ソート処理を実行する前に、入力された日付が有効かどうかを必ず確認しましょう。たとえば「2月29日」は、うるう年でしか存在しない日付です。

日付の検証が完了したら、いよいよソートです。ここでは年 → 月 → 日の優先順位で比較し、古い日付から新しい日付へと昇順に並べ替えていきます。

選択ソート(Selection Sort)とは

選択ソートは、未ソートの範囲から最小の要素を見つけて配列の先頭に移動させ、範囲を1つずつ狭めながら同じ操作を繰り返すことで、すべての要素を昇順に整列させるシンプルなソートアルゴリズムです。

このプログラムでは、選択ソートの手法を応用して、ユーザーが入力した複数の日付を並べ替えます。

まず、順不同の3つの日付を例に、どのようにソートされるのかを見てみましょう。

入力 :
4  1  2012
31 5  2019
19 12 2012

出力 :
4  1  2012
19 12 2012
31 5  2019

解説

すべての日付が有効であるため、プログラムはこれらの日付を昇順(古い順)に並べ替えて出力します。年が最優先で比較され、年が同じ場合は月、月も同じ場合は日が比較される仕組みです。

C++による実装例

以下は、5つの日付を入力として受け取り、日付の妥当性を検証した上で、選択ソートにより昇順に並べ替える完全なプログラムです。

#include<iostream>
using namespace std;

struct date {
    int day;
    int month;
    int year;
    int valid = 1;
};

// 日付の妥当性をチェックする関数
int datevalidate(int dd, int mm, int yy){
    if(yy >= 100 && yy <= 9999){
        if(mm >= 1 && mm <= 12){
            // 31日まである月
            if((dd >= 1 && dd <= 31) && (mm == 1 || mm == 3 || mm == 5 || mm == 7 || mm == 8 || mm == 10 || mm == 12))
                return 1;
            // 30日までの月
            else if((dd >= 1 && dd <= 30) && (mm == 4 || mm == 6 || mm == 9 || mm == 11))
                return 1;
            // 平年の2月
            else if((dd >= 1 && dd <= 28) && (mm == 2))
                return 1;
            // うるう年の2月29日
            else if(dd == 29 && mm == 2 && (yy % 400 == 0 || (yy % 4 == 0 && yy % 100 != 0)))
                return 1;
            else
                return 0;
        } else {
            return 0;
        }
    } else {
        return 0;
    }
}

int main(){
    cout << "Enter 5 dates to be sorted:\n";
    struct date input[5];
    for(int i = 0; i < 5; i++){
        cout << "Enter Date " << (i + 1) << " : ";
        cin >> input[i].day;
        cin >> input[i].month;
        cin >> input[i].year;
        input[i].valid = datevalidate(input[i].day, input[i].month, input[i].year);
        if(!input[i].valid){
            cout << "Date is invalid";
            exit(0);
        }
    }
    // 選択ソート: 年 → 月 → 日 の順に比較して入れ替え
    for(int i = 0; i < 4; i++){
        for(int j = i + 1; j < 5; j++){
            if(input[i].year > input[j].year){
                struct date temp = input[i];
                input[i] = input[j];
                input[j] = temp;
            }
            else if(input[i].year == input[j].year && input[i].month > input[j].month){
                struct date temp = input[i];
                input[i] = input[j];
                input[j] = temp;
            }
            else if(input[i].year == input[j].year && input[i].month == input[j].month && input[i].day > input[j].day){
                struct date temp = input[i];
                input[i] = input[j];
                input[j] = temp;
            }
        }
    }
    cout << "Sorted dates are : \n";
    for(int i = 0; i < 5; i++){
        cout << input[i].day << " " << input[i].month << " " << input[i].year;
        cout << endl;
    }
}

実行結果

Enter 5 dates to be sorted:
Enter date 1 : 5 12 2019
Enter date 2 : 1 2 2012
Enter date 3 : 11 6 2324
Enter date 4 : 29 2 2652
Enter date 5 : 16 5 2012
Sorted dates are :
1 2 2012
16 5 2012
5 12 2019
11 6 2324
29 2 2652

まとめ

このように、構造体で日付を管理し、妥当性チェック(うるう年の判定など)を行った上で選択ソートを適用することで、複数の日付を簡単に昇順へ並べ替えることができます。選択ソートの計算量は O(n²) と、大量のデータには不向きですが、仕組みがシンプルで理解しやすいのが大きな特徴です。日付のような複数のキーを持つデータのソート練習として、ぜひ参考にしてください。

  1. 【C++】選択ソートのアルゴリズムと実装コードをわかりやすく解説

    選択ソート(Selection Sort)は、シンプルで理解しやすいソートアルゴリズムの一つです。この手法では、リストを「ソート済みの部分」と「未ソートの部分」の2つの領域に分けて扱います。 まず、未ソートの領域から最大値(または最小値)を探し出します。ここでは最小値を基準に説明します。最小値が見つかったら、未ソート部分の先頭にあるデータと入れ替えることで、その値をリストの先頭へ移動します。この処理を1回行うごとにソート済みの領域が1つずつ拡大していき、最終的にリスト全体が昇順に並べ替えられます。 選択ソートの計算量 時間計算量:O(n2) 空間計算量:O(1) 選択ソートは追加のメモリを

  2. Pythonで選択ソートを実装する方法|仕組みとサンプルコードをわかりやすく解説

    この記事では、選択ソート(Selection Sort)の基本的な仕組みと、Python 3.x(およびそれ以前のバージョン)での実装方法について解説します。 選択ソートとは 選択ソートは、ソートされていない部分から最小の要素を繰り返し見つけ出し、先頭側へ移動させることで配列全体を整列していくアルゴリズムです。処理の過程で、対象の配列は次の2つの部分配列に分けられます。 すでにソートが完了している部分配列 まだソートされていない部分配列 選択ソートの各イテレーションでは、未ソートの部分配列から最小要素を取り出し、ソート済みの部分配列の末尾に追加していきます。 アルゴリズムの動作イメー