所謂冒泡排序法,就是對一組數字進行從大到小或者從小到大排序的一種算法(因為越大或越小的元素會經由交換慢慢“浮”到數列的頂端,故名)。具體方法是,從第一個數值開始,如果相鄰兩個數的排列順序與我們的期望不同,則將兩個數的位置進行交換;如果其與我們的期望一致,則不用交換。一般地,如果有N個數需要排序,則需要進行(N-1)趟起泡,改進版的冒泡排序需要排序的次數可能會有所減少。 下面這個算法是我們很容易想到的:
void bubble_sort1(int a[],int n) { int i, j; for (i = n - 1; i > 0; i--) { for (j = 0; j < i; j++) { if (a[j] > a[j+1]) { swap(a[j], a[j+1]); } } }}根據上面排序的算法,我們以{1,3,6,5,8,4}為例進行分析。首先這樣的算法對六個數來說需要排5趟,每一趟的結果如下: 第一趟:{1,3,5,6,4,8} 第二趟:{1,3,5,4,6,8} 第三趟:{1,3,4,5,6,8} 第四趟:{1,3,4,5,6,8} 第五趟:{1,3,4,5,6,8} 像上面這種情況,其實我們只用了三趟數據就已經有序了,那怎樣改進才能不用每次都要排(N-1)趟呢? 其實我們可以在每次發生數據交換的地方做一個標記,如果發生了數據交換,我們就繼續排下去,如果沒有發生數據交換,那就說明數據已經是有序的了,此時我們就可以不用再排下去了。從而使排序更高效一些。我們可以使用下面的改進版本的冒牌排序:
void bubble_sort2(int a[], int n) { int i, j, flag; for (i = n - 1; i > 0; i--) { flag = 0; for (j = 0; j < i; j++) { if (a[j] > a[j + 1]) { swap(a[j], a[j + 1]); flag = 1; } } if (flag==0) { //若沒有發生交換,說明數據已經有序 break; } }}冒泡排序的時間復雜度是O(N2)。 假設被排序的數列中有N個數。遍歷一趟的時間復雜度是O(N),需要遍歷多少次呢?N-1次!因此,冒泡排序的時間復雜度是O(N2)。
冒泡排序是穩定的算法,它滿足穩定算法的定義。 算法穩定性 – 假設在數列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。所以這個排序算法是穩定的!

參考http://www.cnblogs.com/skywang12345/p/3596232.html
新聞熱點
疑難解答