冒泡排序的思想比較簡單:相鄰的數(shù)據(jù)進行兩兩比較,小數(shù)放在前面,大數(shù)放在后面,這樣一趟下來,最大的數(shù)就被排在了最后一位,第二趟也是如此,如此類推,直到所有的數(shù)據(jù)排序完成。
我們在開始接觸的時候,只知道排序是把int數(shù)組按照從小到大或者從大到小排序,如果排序的是對象呢?所以我們要明確排序是按照什么來排序。排序指的是將一個數(shù)據(jù)元素的任意序列,重新排列成一個按照關(guān)鍵字有序的序列。
算法思路:
1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
2.對每一對相鄰元素作同樣的工作,從開始第一對到結(jié)尾的最后一對。這步做完后,最后的元素會是最大的數(shù)。
3.針對所有的元素重復(fù)以上的步驟,除了最后一個。
4.持續(xù)每次對越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較。
假如有n個元素需要從小到大排序,當(dāng)?shù)诙阶鐾辏畲蟮脑貢谧詈竺妫悦勘容^完一輪可以把最后一個元素的位置排除即n-1。接下來只需要對其余n-1個數(shù)據(jù)進行兩兩比較,依然從頭開始比較,第二輪下來第二大的數(shù)據(jù)就尾部倒數(shù)第二的位置了,重復(fù)上述過程直到數(shù)據(jù)有序為止。寫法如下:
我之所以在里面加了一個tag,是因為排序的時候,可能在某一輪數(shù)組已經(jīng)是有序的了,以后的比較就沒有意義,所以當(dāng)tag為true時,說明后面已經(jīng)沒有交換的元素的了。假如有n個元素那就需要比較n-1次,如果在第一輪比較就已經(jīng)完成,則后面的n-1-1次的比較將毫無意義,如圖:
圖2中沒有加tag,導(dǎo)致后面的幾次排序都無效。
適用場景:
經(jīng)過上述過程我們了解到冒泡排序的過程存在大量的比較,即使經(jīng)過上面一個小小的優(yōu)化,如果數(shù)據(jù)量特別大并且大部分無序的,同樣需要大量的兩兩比較,時間復(fù)雜度最好最壞均為O(n2),所以冒泡排序適用于數(shù)據(jù)量非常小的排序。