#選択ソート(C言語)
#選択ソートとは
・インプレース整数アルゴリズム。選択ソートは小さなファイルに適している。
・昇順(小さい順)のときは最小値、降順(大きい順)のときは最大値を見つけることを繰り返し行う。
・n個の要素を整列させるのにn-1回の交換が行われる。
パス1でn-1回の比較
パス2でn-2回の比較...(比較対象のデータが1つ減るため)
なので、(n-1)+(n-2)+・・・+1=n(n-1)/2回の比較が行われる。
#利点
・わかりやすい
・インプレースソート(追加の記憶領域が不要)
・バブルソートより高速
#欠点
・規模による計算量の悪化:O(n²)
#全体的な流れ
1.リスト内の最小値(最大値)を見つける。
2.現在の位置の値と交換する。
3.配列全体を整列するまでこの処理をすべての要素に繰り返す。
#実装にあたって
C言語で実装する。
英語と数学の点数を降順(大きい順)に表示する。データの並び替えに選択ソートを用いる。
#コード
selection_sort.c
#include <stdio.h>
#define NMAX 1000
int main(){
int eigo[NMAX], math[NMAX], gokei[NMAX], n, max, work;
printf("data="); scanf("%d", &n);
for (int i = 0; i <n ; ++i) {
printf("[%3dbanme]=", i); scanf("%d %d", &eigo[i], &math[i]);
gokei[i]=eigo[i]+math[i];
}
for (int i = 0; i <n-1 ; ++i) {
max=i;
for (int j = i+1; j <n ; ++j) {
if (gokei[j]>gokei[max]) max=j;
}
if(i!=max) {
work=eigo[i];eigo[i]=eigo[max];eigo[max]=work;
work=math[i];math[i]=math[max];math[max]=work;
work=gokei[i];gokei[i]=gokei[max];gokei[max]=work;
}
}
printf("*** RESULTS ***\n");
printf("RANK ENGLISH MATH TOTAL\n");
for (int i = 0; i <n ; ++i) {
printf("%4d%6d%6d%6d\n", i, eigo[i], math[i], gokei[i]);
}
}
#ソートの計算量
種類 | 計算量 |
---|---|
最悪時計算量 | O(n²) |
最良時計算量 | O(n) |
平均計算量 | O(n²) |
最悪時空間計算量 | O(1)補助領域 |
またなにかあったら書き加えるかもしれません