選択ソートを使って日付を並べ替える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²) と、大量のデータには不向きですが、仕組みがシンプルで理解しやすいのが大きな特徴です。日付のような複数のキーを持つデータのソート練習として、ぜひ参考にしてください。
-
【C++】選択ソートのアルゴリズムと実装コードをわかりやすく解説
選択ソート(Selection Sort)は、シンプルで理解しやすいソートアルゴリズムの一つです。この手法では、リストを「ソート済みの部分」と「未ソートの部分」の2つの領域に分けて扱います。 まず、未ソートの領域から最大値(または最小値)を探し出します。ここでは最小値を基準に説明します。最小値が見つかったら、未ソート部分の先頭にあるデータと入れ替えることで、その値をリストの先頭へ移動します。この処理を1回行うごとにソート済みの領域が1つずつ拡大していき、最終的にリスト全体が昇順に並べ替えられます。 選択ソートの計算量 時間計算量:O(n2) 空間計算量:O(1) 選択ソートは追加のメモリを
-
Pythonで選択ソートを実装する方法|仕組みとサンプルコードをわかりやすく解説
この記事では、選択ソート(Selection Sort)の基本的な仕組みと、Python 3.x(およびそれ以前のバージョン)での実装方法について解説します。 選択ソートとは 選択ソートは、ソートされていない部分から最小の要素を繰り返し見つけ出し、先頭側へ移動させることで配列全体を整列していくアルゴリズムです。処理の過程で、対象の配列は次の2つの部分配列に分けられます。 すでにソートが完了している部分配列 まだソートされていない部分配列 選択ソートの各イテレーションでは、未ソートの部分配列から最小要素を取り出し、ソート済みの部分配列の末尾に追加していきます。 アルゴリズムの動作イメー