ソートアルゴリズム
1. 並べ替えを選択します
基本的な考え方: シーケンスを最初から最後までスキャンし、各パスでソートされる要素から最小 (最大) の要素値を見つけて、その値を最初の要素と交換し、この選択を続けて残りの要素から交換する方法、そして最後に順序付けられたシーケンスを取得します。
元のシーケンス: 45 32 65 98 5 42 11 61
- ① 数列から最小の要素 5 を取り出し、5 を数列の最初の要素と交換すると、要素が 1 つだけ含まれる順序付けされた数列が生成され、元の数列の長さが 1 減ります。
- 結果: 5 [11 32 42 45 65 98]
- ② 元の数列から最小の要素 11 を取り出し、11 を数列の最初の要素と交換すると、要素が 2 つだけの順序数列が生成され、元の数列の長さが 1 減ります。
- 結果: 5 11 [32 42 45 65 98]
- 同じ手順を同じ方法で繰り返します。
- 結果: 5 11 32 [42 45 65 98]
- 結果: 5 11 32 42 [45 65 98]
- 結果: 5 11 32 42 45 [65 98]
- 結果: 5 11 32 42 45 65 [98]
- 最後の要素は最大の要素である必要があり、並べ替えると順序付けされたシーケンスが直接生成されます。
- 最終結果: 5 11 32 42 45 65 98
プログラミング手順:
- 配列を定義し、配列に保存する値を入力します。
- 元の順序なしシーケンスで、最初の最小値とインデックスを見つけます。
- その後、最小値のインデックスが元の値と矛盾し、値が交換されます。
- 手順②③を繰り返します。
- 最後に結果を出力します。
//1.选择排序算法
#include<iostream>
using namespace std;
int a[1000];
int main(){
int n,min,index;
cin>>n;
for(int i=0;i<n;i++){ //1.输入值到数组
cin>>a[i];
}
for(int i=0;i<n;i++){
min = a[i]; // 假设第一个为最小值
index = i; // 锁定最小值索引
for(int j=i+1;j<n;j++){ //逐个跟后面比对
if(min>a[j]){ // 大于最小值,则更新值
min = a[j]; //更新值
index = j; //更新索引
}
}
if(i!=index){ // 当索引不一致,代表最小值变了
swap(a[i],a[index]); //那就交换第一个值与最小值的位置。
}
}
for(int i=0;i<n;i++){ //输出结果。
cout<<a[i]<<" ";
}
return 0;
}
- 安定性: ソート対象の配列内に元の両端の要素と等しい要素が存在する場合、安定性が崩れる可能性があります。たとえば、[2,4,2,1,3] の場合、ソート後、[1,2,2,3,4] の a[2] は元の a[2] と矛盾し、安定性が崩れます。したがって、選択ソートは不安定なソート アルゴリズムです。
- 時間計算量: 選択ソートの時間計算量は O( ) です。
- 適用可能なシナリオ: 並べ替えられるシーケンス内の要素の数が少ない場合。
2. バブルソーティング
基本的な考え方: 隣接する要素をペアで比較し、大きい数値が沈み (行の最後尾)、小さい数値が上 (行の先頭) になります。このようにして、比較後の最大 (最小) 値は次のようになります。最後に整理しました。このプロセス全体が泡が立ち上るようなので、バブルソートと呼ばれます。
元のシーケンス: 45 32 65 98 5 42 11 61
- ① 前から後ろへ、隣接する 2 つの数字を比較して、大きい方が後ろに、小さい方が前にあります。
- 最初の並べ替え: 32 45 65 5 42 11 61 98;最大の数値が最後に来ていることがわかります。
- 次に、1 つがソートされるため、ソート比較の数を 1 つ減らすことができます。
- 順序なしでバブル ソートを実行します: 32 45 65 5 42 11 61 ;
- 2 回目の並べ替え: 32 45 5 42 11 61 65 98;
- 3 回目の並べ替え: 32 5 42 11 45 61 65 98;
- 4 回目の並べ替え: 5 32 11 42 45 61 65 98;
- 5 回目の並べ替え: 5 11 32 42 45 61 65 98;
- 6 回目の並べ替え: 5 11 32 42 45 61 65 98;
- 6 回目のソートが変化していないことが判明すると、ループが終了し、ソートが終了します。
プログラミング手順:
- 配列を定義し、配列に保存する値を入力します。
- 隣接する 2 つの値を比較し、前者が後者より大きい場合、2 つの値を交換します。
- 最初のものから最後のものまで、今回で並べ替えは完了です。
- 手順②③を繰り返し、比較しても値が変化しなくなるまでサイクルを終了します。
- 最後に結果を出力します。
//2.冒泡排序
#include<iostream>
using namespace std;
int a[1000];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){ //1.输入值到数组
cin>>a[i];
}
for(int i=n-1;i>0;i--){
bool flag = true; //假设排好
for(int j=0;j<i;j++){
if(a[j]>a[j+1]){ //比较相邻的值
swap(a[j],a[j+1]); //交换
flag = false;
}
}
if(flag==true) break; //某一轮排好,没有交换,提前终止。
}
for(int i=0;i<n;i++){ //输出结果
cout<<a[i]<<" ";
}
return 0;
}
- 安定性: バブルソートでは、等しい値は交換されず、不等な値のみが交換されるため、安定したソート方法です。
- 時間計算量: 選択ソートの時間計算量は O( ) です。
- 適用可能なシナリオ: バブル ソートの実装は比較的簡単であるため、バブル ソートは少量のデータを含むソート シナリオに適しています。