直接上代碼:
#include <iostream> using namespace std; void BubbleSort(int arr[],int n){ while(n-->0) //在本例中,第1次執行while時,n的值為9,即(n-1) for(int i=0;i<n;i++){ //如果當前元素比后面相鄰的元素大,則交換相鄰元素數值 if(arr[i]>arr[i+1]) swap(arr[i],arr[i+1]); } } int main(){ int a[10]={10,9,8,7,6,5,4,3,2,1}; BubbleSort(a,10); for(int i=0;i<10;i++){ cout<<a[i]<<" "; } cout<<endl; return 0; }
考慮一下,如果冒泡法在執行期間,執行到某個元素(不是最后一個元素),此時如果序列已經有序,那么算法會停下來嗎?答案當然是否定的,只有遍歷完整個待排序序列算法才會停下來。那么后面剩余元素的遍歷就成了徒勞的浪費時間,因此,我們可以為我們的算法立個flag來標記一下,以確定它不會執行多余操作。
那么冒泡排序算法結束的條件就是:在一趟排序過程中沒有發生元素的交換。
所以我們可以對關鍵代碼做以下優化
void BubbleSort(int arr[],int n){ int flag; //標記 while((n--)>0){ flag=0; //標記初始值為0 for(int i=0;i<n;i++){ if(arr[i]>arr[i+1]){ swap(arr[i],arr[i+1]); flag=1; //如果發生交換,標記就重置為1 } } if(flag==0) //如果標記還是初始值,那么證明這一趟沒有發生數值交換,即完成排序 return; } }
對於冒泡排序,一趟排序后能確保一個關鍵字到達其最終位置。