C++ 基本アルゴリズム③——ソートアルゴリズム (選択、完全なコードを添付したバブリング)

ソートアルゴリズム

1. 並べ替えを選択します

2. バブルソーティング


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. 配列を定義し、配列に保存する値を入力します。
  2. 元の順序なしシーケンスで、最初の最小値とインデックスを見つけます。
  3. その後、最小値のインデックスが元の値と矛盾し、値が交換されます。
  4. 手順②③を繰り返します。
  5. 最後に結果を出力します。
//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;
} 

  1.  安定性: ソート対象の配列内に元の両端の要素と等しい要素が存在する場合、安定性が崩れる可能性があります。たとえば、[2,4,2,1,3] の場合、ソート後、[1,2,2,3,4] の a[2] は元の a[2] と矛盾し、安定性が崩れます。したがって、選択ソートは不安定なソート アルゴリズムです。
  2. 時間計算量: 選択ソートの時間計算量は O( n^{2}) です。
  3. 適用可能なシナリオ: 並べ替えられるシーケンス内の要素の数が少ない場合。
     

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 回目のソートが変化していないことが判明すると、ループが終了し、ソートが終了します。

プログラミング手順:

  1. 配列を定義し、配列に保存する値を入力します。
  2. 隣接する 2 つの値を比較し、前者が後者より大きい場合、2 つの値を交換します。
  3. 最初のものから最後のものまで、今回で並べ替えは完了です。
  4. 手順②③を繰り返し、比較しても値が変化しなくなるまでサイクルを終了します。
  5. 最後に結果を出力します。
//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;
}

  1. 安定性: バブルソートでは、等しい値は交換されず、不等な値のみが交換されるため、安定したソート方法です。
  2. 時間計算量: 選択ソートの時間計算量は O( n^{2}) です。
  3. 適用可能なシナリオ: バブル ソートの実装は比較的簡単であるため、バブル ソートは少量のデータを含むソート シナリオに適しています。

おすすめ

転載: blog.csdn.net/weixin_44775255/article/details/129685211