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

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

選択ソート(Selection Sort)は、シンプルで理解しやすいソートアルゴリズムの一つです。この手法では、リストを「ソート済みの部分」と「未ソートの部分」の2つの領域に分けて扱います。

まず、未ソートの領域から最大値(または最小値)を探し出します。ここでは最小値を基準に説明します。最小値が見つかったら、未ソート部分の先頭にあるデータと入れ替えることで、その値をリストの先頭へ移動します。この処理を1回行うごとにソート済みの領域が1つずつ拡大していき、最終的にリスト全体が昇順に並べ替えられます。

選択ソートの計算量

  • 時間計算量:O(n2)

  • 空間計算量:O(1)

選択ソートは追加のメモリをほとんど必要としない一方で、要素数が増えると比較回数が要素数の2乗に比例して増加するため、大規模なデータには不向きです。また、同じ値の相対的な順序が保持されない「非安定ソート」である点にも注意が必要です。

入力 − ソートされていないリスト: 5 9 7 23 78 20
出力 − ソート後の配列: 5 7 9 20 23 78

アルゴリズム

selectionSort(array, size)

入力:データの配列と、配列内の要素の総数

出力:ソート済みの配列

Begin
    for i := 0 to size-2 do //i番目以降の範囲から最小値を探す
        iMin := i;
        for j := i+1 to size-1 do
            if array[j] < array[iMin] then
                iMin := j
        done
        array[i] と array[iMin] を入れ替える
    done
End

C++による実装例

#include<iostream>
using namespace std;
void swapping(int &a, int &b) {          //aとbの内容を入れ替える
    int temp;
    temp = a;
    a = b;
    b = temp;
}
void display(int *array, int size) {
    for(int i = 0; i<size; i++)
        cout << array[i] << " ";
    cout << endl;
}
void selectionSort(int *array, int size) {
    int i, j, imin;
    for(i = 0; i<size-1; i++) {
        imin = i;   //最小値のインデックスを取得
        for(j = i+1; j<size; j++)
            if(array[j] < array[imin])
                imin = j;
            //最小値を正しい位置へ配置
            swap(array[i], array[imin]);
    }
}
int main() {
    int n;
    cout << "Enter the number of elements: ";
    cin >> n;
    int arr[n];   //指定された要素数で配列を作成
    cout << "Enter elements:" << endl;
    for(int i = 0; i<n; i++) {
        cin >> arr[i];
    }
    cout << "Array before Sorting: ";
    display(arr, n);
    selectionSort(arr, n);
    cout << "Array after Sorting: ";
    display(arr, n);
}

このプログラムでは、まず要素数と各要素の値を入力として受け取り、ソート前の配列を表示します。その後、selectionSort()関数で選択ソートを実行し、ソート後の配列を出力します。

実行結果

Enter the number of elements: 6
Enter elements:
5 9 7 23 78 20
Array before Sorting: 5 9 7 23 78 20
Array after Sorting: 5 7 9 20 23 78
  1. C++で基数ソート(ラディックスソート)を実装するプログラム

    基数ソート(ラディックスソート)は、非比較型のソートアルゴリズムの一つです。要素同士を直接比較するのではなく、整数キーを構成する各桁に注目し、同じ桁位置・同じ値を持つ数字どうしをグループ化しながら並べ替えを行います。 「基数」とは記数法における底のことです。私たちが普段使う10進法では基数は10であるため、10進数を基数ソートで並べ替える際には、数値を一時的に格納するための10個のバケット(ポケット)が必要になります。 基数ソートの計算量 時間計算量: O(nk) ※nは要素数、kは最大桁数 空間計算量: O(n+k) 入力 − ソート前のデータ: 802 630 20 745 52 3

  2. C++でクイックソートを実装するプログラム|ランダム化で最悪ケースO(n²)を回避

    クイックソート(Quick Sort)は「分割統治法(divide-and-conquer)」に基づく高速な整列アルゴリズムです。平均時間計算量は O(n log n) と非常に効率的ですが、ピボットの選び方次第では最悪ケースで O(n²) まで計算量が悪化する可能性があります。 そこで本記事では、乱数を用いてピボットをランダムに選択する「ランダム化クイックソート」をC++で実装し、最悪ケースが発生する確率を大幅に下げる方法を解説します。 アルゴリズム Partition(int a[], int l, int h) 配列 a の範囲 [l, h] を、ピボットより小さいグループと大きい