前言
社長,一個愛學習,愛分享的程序猿,始終相信,付出總會有回報的。知識改變命運,學習成就未來。愛拼纔會贏!
程序猿學社的GitHub,已整理成相關技術專刊,歡迎Star:。
https://github.com/ITfqyd/cxyxs
首先回顧下上一章內容,社長給大家講了講,如何驗證一個算法的好壞。再有就是時間複雜度的功能如何表示。
什麼是冒泡排序?
冒泡排序(Bubble Sort)是一種簡單的排序算法。
它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從從Z到A)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。
這個算法的名字由來是因爲越小的元素會經由交換慢慢“浮”到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“冒泡排序”。
冒泡排序的算法邏輯是怎麼樣實現的?
- 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
- 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
- 針對所有的元素重複以上的步驟,除了最後一個。
- 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較
排序過程
詳細是怎麼樣移動比較的,請聽娓娓道來。
假設有這樣一個數組,需要進行一場拳王爭霸賽,有編號爲4,10,9,8,1這前5位選手參加,爲了保證賽場的公平公正,讓每一個人都無法可說。我們通過冒泡排序賽制的方式,來開展。
首先進行第一屆拳王爭霸賽比賽
第一輪:
第一次pk:
4和10比較,10大,不換位置
第2次pk:
10和9比較,10大,換位置,恭喜叫10的選手再次ko掉一個選手
變成
第三次PK:
10和8比,10大,換位置,恭喜叫10的選手再次ko掉一個選手
變成
第四次pk:
10和1比較,10大,交換位置,恭喜叫10的選手再次ko掉一個選手
就這樣,第一屆拳王爭霸賽,編號爲10的選手獲得冠軍。
第二輪:
由於我們已經選出第一名是選手編號爲10的,這第二輪的任務就是選出亞軍top2,實際上選手10,已經是公認的第一,所以,他就不參加相關的後續比賽。
根據第一輪,我們依次選出第2名,是選手9
因此類推。
最終的排名已經出來了。
瞭解了冒泡排序的一個算法,我們再來看看他通過代碼如何實現。
import java.util.Arrays;
/**
* Description:
* Author: wude
* Date: 2020/1/5 14:22
* Modified By:
*/
public class Test {
public static void main(String[] args) {
int[] arrs = {4,10,9,8,1};
sort(arrs);
for (int i=0;i<arrs.length;i++){
System.out.println(arrs[i]);
}
}
public static void sort(int []arr) {
for(int i =1;i<arr.length;i++) {
for(int j=0;j<arr.length-i;j++) {
if(arr[j]>arr[j+1]) {
int temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
};
};
System.out.println(Arrays.toString(arr));
}
}
}
爲什麼冒泡排序的表達式爲O(N²)?
下面我們來推導一下
第一次是N
第二次是N-1
….
最後一次是1
是一個等差數列,所以他最終的表達可能爲這種結構
aN²+bN+1
通過我上一章說的,不要低階項,也不要高階項係數。
所以最終冒泡排序的時間複雜度爲O(N²),由於他只是進行內部的一個位置交換,所以他的性能是穩定的。
注意:我這裏實現的冒泡排序,爲了講解需要,方便理解,是性能最差的一種。大家可以試着自己優化一下。
後記
程序猿學社的GitHub,歡迎Star:
https://github.com/ITfqyd/cxyxs
覺得有用,可以點贊,關注,評論,留言四連發。