冒泡排序是很是容易理解和實現,,以從小到大排序舉例: windows
設數組長度爲N。 數組
1.比較相鄰的先後二個數據,若是前面數據大於後面的數據,就將二個數據交換。 優化
2.這樣對數組的第0個數據到N-1個數據進行一次遍歷後,最大的一個數據就「沉」到數組第N-1個位置。 spa
3.N=N-1,若是N不爲0就重複前面二步,不然排序完成。 .net
按照定義很容易寫出代碼: blog
- //冒泡排序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,且這個位置以後的數據一定已經有序了,記錄下這位置,第二次只要從數組頭部遍歷到這個位置就能夠了。 get
- //冒泡排序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;
- }
- }
- }
冒泡排序畢竟是一種效率低下的排序方法,在數據規模很小時,能夠採用。數據規模比較大時,最好用其它排序方法。 it
原文地址:
http://blog.csdn.net/morewindows/article/details/6657829