ソートアルゴリズム - バブルソート(再帰的および非再帰的)
学習記録
バブル ソートは、コンピューター サイエンスの分野における比較的単純な並べ替えアルゴリズムです。
ソート対象の要素の列を繰り返し訪問し、隣接する 2 つの要素を順番に比較し、順序 (大から小、頭文字 Z から A など) が間違っている場合は要素を交換します。要素を訪問する作業は、隣接する要素を交換する必要がなくなるまで、つまり要素列がソートされるまで繰り返されます。
このアルゴリズムの名前は、ちょうど炭酸飲料の二酸化炭素の泡が最終的に上部に浮かぶのと同じように、より小さい要素が交換によってシーケンスの上部に (昇順または降順で) ゆっくりと「浮く」という事実に由来しています。したがって、「バブリング」という名前が付けられています。
(つまり、2 つの小さい数値が前 (昇順) に配置され、大きい数値が後ろに配置されます。)
バブル ソート アルゴリズムの原理は次のとおりです:
隣接する要素を比較します。最初のものが 2 番目のものより大きい場合は、両方を交換します。
隣接する要素の各ペアに対して、最初の最初のペアから最後の最後のペアまで同じことを行います。この時点では、最後の要素が最大の数値である必要があります。
最後の要素を除くすべての要素に対して上記の手順を繰り返します。
比較する数値のペアがなくなるまで、要素の数を減らしながら上記の手順を繰り返します。
非再帰的(二重ループ):
void bubblesort1(int a[],int n)//非递归双循环
{
int i,j,ifswap=0;//定义是否交换的一个变量,如果提前排好序就结束排序。
for(i=0;i<n-1;i++)
{
ifswap=0;
for(j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
swap(&a[j],&a[j+1]);ifswap=1;}
}
if(ifswap==0)break;//如果没有交换就表示已经排好序,直接结束排序
}
再帰:
void bubblesort2(int a[],int n)//递归
{
int i,ifswap=0;
for(i=0;i<n-1;i++)
{
if(a[i]>a[i+1]){
swap(&a[i],&a[i+1]);ifswap=1;}
}
if(ifswap==0)return;//如果没有交换,那就表明已排好序。
bubblesort2(a,n-1);//每次排序其实会把最大的数放到最后,下一次排序只需要排前面的几项就可以了
}
完全なコード:
#include<stdio.h>
void swap(int *a,int *b)
{
int temp;
temp = *a;
*a=*b;
*b=temp;
}
void bubblesort1(int a[],int n)//非递归双循环
{
int i,j,ifswap=0;//定义是否交换的一个变量,如果提前排好序就结束排序。
for(i=0;i<n-1;i++)
{
ifswap=0;
for(j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
swap(&a[j],&a[j+1]);ifswap=1;}
}
if(ifswap==0)break;//如果没有交换就表示已经排好序,
//直接结束排序
}
}
void bubblesort2(int a[],int n)//递归
{
int i,ifswap=0;
for(i=0;i<n-1;i++)
{
if(a[i]>a[i+1]){
swap(&a[i],&a[i+1]);ifswap=1;}
}
if(ifswap==0)return;//如果没有交换,那就表明已排好序。
bubblesort2(a,n-1);//每次排序其实会把最大的数放到最后,下一次排序只需要排前面的几项就可以了
}
int main()
{
int a[]={
3,5,1,-7,4,9,-6,8,10,4};
int n=(int)sizeof(a)/sizeof(int);
int i;
bubblesort1(a,n);//非递归双循环
//bubblesort2(a,n);//递归
for(i=0;i<n;i++)printf("%3d",a[i]);
printf("\n");
return 0;
}