C言語 - バブルソート(詳細解析)

バブルソート

並べ替えアルゴリズムの概要

並べ替えは、並べ替えアルゴリズム (Sort Algorithm) とも呼ばれ、一連のデータを指定された順序で並べ替える処理です。

分類されたカテゴリ

(1) 内部仕分け:

処理が必要なすべてのデータを **内部ストレージ (メモリ)** にロードして並べ替えることを指します。

(2) 外部ソート方法:

データ量が大きすぎてメモリに完全にロードできないため、並べ替えには外部ストレージが必要です。

[キー] バブルソート

1. 基本的な紹介

バブルソート (Bubble Sorting) の基本的な考え方は、前から後ろへ (添字の小さい要素から開始して) ソート順序を処理することにより、隣接する要素の値を順番に比較し、逆の順序を見つけて、値の大きい要素が前から後ろに徐々に移動し、水中の泡のように徐々に上昇します。

ソート処理中、各要素は常にそれぞれの位置に近づいているため、比較後に交換がない場合は、順序が正しいことを意味します。したがって、ソート処理中にフラグを設定して、要素が正しいかどうかを判断する必要があります。交換されました。これにより、不必要な比較が削減されます。

2. バブルソーティングの応用例

バブル ソート法を使用して、順序のない 5 つの数値 {3、9、-1、10、-2} を小さい順から大きい順に並べます。

3. バブリングプロセス + コードを分析する

画像-20221027211306669

コード:

#include <stdio.h>
int main(){
    
    
	
	int arr[] = {
    
    3,9,-1,10,-2};
	
	//第一轮排序
	
	int j;
	int t;//临时变量
	for(j=0;j<4;j++){
    
    
		
		//如果前面的数大于的后面的数,就交换
		if(arr[j]>arr[j+1]){
    
    
			t = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = t;
		}
	}
	//输出看看第一轮的排序后的情况
	for(j=0;j<5;j++){
    
    
		printf(" %d",arr[j]);	
	}
	printf("\n");
	//第二轮排序
	for(j=0;j<3;j++){
    
    
		
		//如果前面的数大于的后面的数,就交换
		if(arr[j]>arr[j+1]){
    
    
			t = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = t;
		}
	}
	//输出看看第二轮的排序后的情况
	for(j=0;j<5;j++){
    
    
		printf(" %d",arr[j]);	
	}
	printf("\n");
	
	//第三轮排序
	for(j=0;j<2;j++){
    
    
		
		//如果前面的数大于的后面的数,就交换
		if(arr[j]>arr[j+1]){
    
    
			t = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = t;
		}
	}
	//输出看看第三轮的排序后的情况
	for(j=0;j<5;j++){
    
    
		printf(" %d",arr[j]);	
	}
	
	printf("\n");
	//第四轮排序
	for(j=0;j<1;j++){
    
    
		
		//如果前面的数大于的后面的数,就交换
		if(arr[j]>arr[j+1]){
    
    
			t = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = t;
		}
	}
	//输出看看第四轮的排序后的情况
	for(j=0;j<5;j++){
    
    
		printf(" %d",arr[j]);	
	}
	return 0;
}

ソートの各ラウンドはほぼ同じであるため、for ループを使用してコードを簡素化し、同時に配列サイズの変数 arrLen を定義してコードをより柔軟にすることができます。

#include <stdio.h>
int main(){
    
    
	
	int arr[] = {
    
    3,9,-1,10,-2};
	
	//因为每轮排序几乎一样,因此,我们可以使用for循环处理
	
	//第一轮排序
	
	int j,i;
	int t;//临时变量
	int arrLen = sizeof(arr) / sizeof(int); // 5 数组大小
	for(i=0;i<arrLen-1;i++){
    
    
		for(j=0;j<arrLen-1-i;j++){
    
    		
		//如果前面的数大于的后面的数,就交换
		if(arr[j]>arr[j+1]){
    
    
			t = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = t;
			}
		}
		//输出看看第一轮的排序后的情况
		for(j=0;j<arrLen;j++){
    
    
			printf(" %d",arr[j]);	
		}
		printf("\n");	
	}
	return 0;
}

毎回コードを繰り返すのは面倒なので、上記のコードをバブルソートの関数にカプセル化できます。

#include <stdio.h>
//冒泡排序的函数
void bubbleSort(int arr[],	int arrLen){
    
    
	
	int j,i;
	int t;//临时变量	
		//因为每轮排序几乎一样,因此,我们可以使用for循环处理
	for(i=0;i<arrLen-1;i++){
    
    
		for(j=0;j<arrLen-1-i;j++){
    
    		
		//如果前面的数大于的后面的数,就交换
		if(arr[j]>arr[j+1]){
    
    
			t = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = t;
			}
		}	
	}
}

int main(){
    
    
	
	int j;
	int arr[] = {
    
    3,9,-1,10,-2};
	int arrLen = sizeof(arr) / sizeof(int); // 5 数组大小
	bubbleSort(arr,arrLen);//数组默认是地址传递 (指针)
	printf("\n排序后(函数)\n");
		for(j=0;j<arrLen;j++){
    
    
			printf(" %d",arr[j]);	
		}

	return 0;
}

おすすめ

転載: blog.csdn.net/m0_53415522/article/details/127566627