バブルソート
記事ディレクトリ
並べ替えアルゴリズムの概要
並べ替えは、並べ替えアルゴリズム (Sort Algorithm) とも呼ばれ、一連のデータを指定された順序で並べ替える処理です。
分類されたカテゴリ
(1) 内部仕分け:
処理が必要なすべてのデータを **内部ストレージ (メモリ)** にロードして並べ替えることを指します。
(2) 外部ソート方法:
データ量が大きすぎてメモリに完全にロードできないため、並べ替えには外部ストレージが必要です。
[キー] バブルソート
1. 基本的な紹介
バブルソート (Bubble Sorting) の基本的な考え方は、前から後ろへ (添字の小さい要素から開始して) ソート順序を処理することにより、隣接する要素の値を順番に比較し、逆の順序を見つけて、値の大きい要素が前から後ろに徐々に移動し、水中の泡のように徐々に上昇します。
ソート処理中、各要素は常にそれぞれの位置に近づいているため、比較後に交換がない場合は、順序が正しいことを意味します。したがって、ソート処理中にフラグを設定して、要素が正しいかどうかを判断する必要があります。交換されました。これにより、不必要な比較が削減されます。
2. バブルソーティングの応用例
バブル ソート法を使用して、順序のない 5 つの数値 {3、9、-1、10、-2} を小さい順から大きい順に並べます。
3. バブリングプロセス + コードを分析する
コード:
#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;
}