白話の経典のアルゴリズムのシリーズの1つの泡の順序付けの3種類の方案

2560 ワード

http://blog.csdn.net/morewindows/article/details/6657829
バブルソートは、小さいものから大きいものへのソートの例として、非常に容易に理解され、実装される.
配列長をNとする.
1.隣接する前後の2つのデータを比較し、前のデータが後のデータより大きい場合、2つのデータを交換する.
2.このように配列の0番目のデータをN-1番目のデータに1回遍歴すると、最大のデータは配列のN-1番目の位置に「沈」する.
3.N=N-1で、Nが0でない場合は前の2つのステップを繰り返し、そうでない場合はソートが完了します.
定義に従ってコードを簡単に書きます.
 
//    1
void BubbleSort1(int a[], int n)
{
       int i, j;
       for (i = 0; i < n; i++)
              for (j = 1; j < n - i; j++)
                     if (a[j - 1] > a[j])
                            Swap(a[j - 1], a[j]);
}

次に最適化し、フラグを設定します.このフラグが交換された場合はtrue、そうでない場合はfalseです.明らかに交換が発生しなかった場合は、ソートが完了したことを示します.
//    2
void BubbleSort2(int a[], int n)
{
       int j, k;
       bool flag;

       k = n;
       flag = true;
       while (flag)
       {
              flag = false;
              for (j = 1; j < k; j++)
                     if (a[j - 1] > a[j])
                     {
                            Swap(a[j - 1], a[j]);
                            flag = true;
                     }
              k--;
       }
}

さらに最適化します.100個の数の配列があって、前の10個だけが無秩序で、後ろの90個はすでに順序が整い、前の10個より大きい場合、最初の遍歴後、最後に交換が発生した位置は必ず10未満であり、この位置の後のデータは必ず秩序が整っているので、この位置を記録して、2回目は配列の頭からこの位置まで遍歴すればよい.
//    3
void BubbleSort3(int a[], int n)
{
	int j, k;
	int flag;
	
	flag = n;
	while (flag > 0)
	{
		k = flag;
		flag = 0;
		for (j = 1; j < k; j++)
			if (a[j - 1] > a[j])
			{
				Swap(a[j - 1], a[j]);
				flag = j;
			}
	}
}

バブルソートは結局効率の低いソート方法であり,データ規模が小さい場合に採用できる.データ規模が大きい場合は、他のソート方法が望ましい.
 
完全なコードは次のとおりです.
 
void sortHello(int a[],int len1)
{
	for(int i=0;i<=len1;i++)
	{
		for(int j=i;j<=len1;j++)
		{
			if(a[i]>a[j])
			{
				swap(a[i],a[j]);
			}
		}
	}
}
BOOL falg;
void sortHello1(int a[],int len1)
{
	for(int i=0;i<=len1;i++)
	{
		falg=false;
		for(int j=1;j<=len1-i;j++)
		{
			if(a[j]<a[j-1])
			{
				swap(a[j],a[j-1]);
				falg=true;
			}
		}
		if(!falg)
			return;
	}
}
void BubbleSort3(int a[],int n)
{
	int j,k;
	int flag;
	flag=n;
	while(flag>0)
	{
		k=flag;
		flag=0;
		for(j=1;j<=k;j++)
		{
			if(a[j-1]>a[j])
			{
				swap(a[j-1],a[j]);
				flag=j;
			}
		}
	}
}


int main(void)
{
	int a[]={0,2,4,6,9,20,1,3,4,5,67,8};
	int len1=(sizeof(a)/sizeof(int))-1;
	sortHello(a,len1);
	for(int i=0;i<=len1;i++)
		cout<<a[i]<<" ";
	cout<<endl;
	return 0;
}