經典排序算法系列(一)--------------冒泡排序算法


冒泡排序(Bubble Sort),是一種計算機科學領域的較簡單的排序算法
它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。 這個算法的名字由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端,故名。 算法原理
  1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。
  3. 針對所有的元素重復以上的步驟,除了最后一個。
  4. 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
時間復雜度
若文件的初始狀態是正序的,一趟掃描即可完成排序。所需的關鍵字比較次數  和記錄移動次數  均達到最小值:    所以,冒泡排序最好的時間復雜度  
若初始文件是反序的,需要進行  趟排序。每趟排序要進行  次關鍵字的比較(1≤i≤n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:冒泡排序的最壞時間復雜度為  綜上,因此冒泡排序總的平均時間復雜度為  

算法穩定性

冒泡排序就是把小的元素往前調或者把大的元素往后調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,我想你是不會再無聊地把他們倆交換一下的;如果兩個相等的元素沒有相鄰,那么即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前后順序並沒有改變,所以冒泡排序是一種穩定排序算法。
其代碼實現如下第一種:
public void sort(int[] a) {
int temp;
for (int i = 0; i < a.length; i++) {
for (int j = i + 1; j < a.length; j++) {
if (a[i] > a[j]) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
這種代碼是最基本的但是不高效,對於數組a[]={10,2,9,7,5,8,3,1,4,6}  第一次循環  用啊a[0]=10與剩余九個進行比較取得最小值,第二次循環用a[1]位置的數與剩余8個進行比較 ,以此類推。
優化后第二種代碼如下
public void sort(int[] a) {
int temp;
for (int i = 0; i < a.length; i++) {
for (int j = a.length - 2; j >= i; j--) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
  對於數組a[]={10,2,9,7,5,8,3,1,4,6}  這種代碼從后往前比較,每兩個相鄰的都比較一次,把小的往前排,大的往后排。比第一種代碼更高效率。但是數組a[]={2,1,3,4,5,6,7,8,9,10} 排序我們發現除了需要對前兩個排序后面就不需要了,但是按這個代碼,其還會進行比較,浪費時間,第三中代碼對其進行優化,設置一個標志
第三代碼
public void sort(int[] a) {
int temp;
boolean flag = true;
for (int i = 0; i < a.length <strong>&& flag</strong>; i++) {
flag = false;
for (int j = a.length - 2; j >= i; j--) {

if (a[j] > a[j + 1]) {

temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag = true;
}
}
}









注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com