交換排序:兩兩比較待排序記錄的關鍵碼,若是逆置,則交換,直到無逆置。其中最簡單的交換排序是:冒泡排序。
冒泡排序(Bubble Sort,也叫起泡排序):不斷地比較相鄰的記錄,若是不滿足排序要求,則交換。
交換時,可從前向後,也可從後向前。看一個從前向後的排序過程:
原序列 12 3 45 33 6
下標 0 1 2 3 4
第一趟:
3 12 45 33 6 (3,12交換)
3 12 45 33 6 (12,45不用交換)
3 12 33 45 6 (45,33交換)
3 12 33 6 45 (45,6交換)
第二趟:
3 12 33 6 45 (3,12不用交換)
3 12 33 6 45 (12,33不用交換)
3 12 6 33 45 (33,6交換)
第三趟:
3 12 6 33 45 (3,12不用交換)
3 6 12 33 45 (12,6交換)
第四趟:
3 6 12 33 45 (3,6不用交換)
結束。以上過程非常之詳盡,相信你一定懂了。
代碼一:
void BubbleSort10(int a[], int n) //從左向右 { if (a && n > 1) { int i,j; for (i = 1; i < n; i++) //最多只需進行n-1趟排序 for (j = 0; j < n - i ; j++) { if (a[j] > a[j+1]) Swap(a[j], a[j+1]); } } } void BubbleSort11(int a[], int n) //從右向左 { if (a && n > 1) { int i,j; for (i = 1; i < n; i++) for (j = n - 1; j>=i; j--) { if (a[j - 1] > a[j]) Swap(a[j - 1], a[j]); } } }
是的!既然如此,下一趟排序就不用進行了。
針對代碼一,給出優化的代碼二:
void BubbleSort20(int a[], int n) //從左向右 { if (a && n > 1) { int i,j = n-1; bool flag = true; while(flag) { flag = false; for (i = 0; i < j; i++) if (a[i] > a[i+1]) { Swap(a[i], a[i+1]); flag = true; } j--; } } } void BubbleSort21(int a[], int n) //從右向左 { if (a && n > 1) { int i,j = 1; bool flag = true; while(flag) { flag = false; for (i = n - 1; i >= j; i--) if (a[i - 1] > a[i]) { Swap(a[i - 1], a[i]); flag = true; } j++; } } }
有的,記錄上一趟排序時交換元素的最遠距離,下一趟排序最遠只到這個位置。
針對代碼二,給出優化的代碼三:
void BubbleSort30(int a[], int n) //從左向右 { if (a && n > 1) { int i,k,j = n-1; bool flag = true; while(flag) { flag = false; k = 0; for (i = 0; i < j; i++) { if (a[i] > a[i+1]) { Swap(a[i], a[i+1]); flag = true; k = i; } } if (k == 0) break; j = k; } } } void BubbleSort31(int a[], int n) //從右向左 { if (a && n > 1) { int i,k,j = 1; bool flag = true; while(flag) { flag = false; k = n - 1; for (i = n - 1; i >= j; i--) { if (a[i - 1] > a[i]) { Swap(a[i - 1], a[i]); flag = true; k = i; } } if (k == n - 1) break; j = k; } } }
交換方法的代碼是這樣:
void Swap(int &a, int &b) { if(a!=b) { a^=b; b^=a; a^=b; } }
小結:
冒泡排序是穩定的,但不高效。時間復雜度是O(n^2)。
轉載請注明出處,本文地址:http://blog.csdn.net/zhangxiangdavaid/article/details/30271613
若是有所幫助,頂一個哦!
專欄目錄看這裡:數據結構與算法目錄