白話經典演算法系列之中的一個 氣泡排序的三種實現

weixin_34067049發表於2015-03-27

 氣泡排序是很easy理解和實現,,以從小到大排序舉例:

設陣列長度為N。

1.比較相鄰的前後二個資料,假設前面資料大於後面的資料,就將二個資料交換。

2.這樣對陣列的第0個資料到N-1個資料進行一次遍歷後,最大的一個資料就“沉”到陣列第N-1個位置。

3.N=N-1,假設N不為0就反覆前面二步,否則排序完畢。

 

依照定義非常easy寫出程式碼:

//氣泡排序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,且這個位置之後的資料必然已經有序了,記錄下這位置,第二次僅僅要從陣列頭部遍歷到這個位置就能夠了。

//氣泡排序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;
			}
	}
}

氣泡排序畢竟是一種效率低下的排序方法,在資料規模非常小時,能夠採用。資料規模比較大時,最好用其他排序方法。

相關文章