《算法學習》二 冒泡排序分析

前言

社長,一個愛學習,愛分享的程序猿,始終相信,付出總會有回報的。知識改變命運,學習成就未來。愛拼纔會贏!
程序猿學社的GitHub,已整理成相關技術專刊,歡迎Star:
https://github.com/ITfqyd/cxyxs

首先回顧下上一章內容,社長給大家講了講,如何驗證一個算法的好壞。再有就是時間複雜度的功能如何表示。

什麼是冒泡排序?

冒泡排序(Bubble Sort)是一種簡單的排序算法。

它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從從Z到A)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。

這個算法的名字由來是因爲越小的元素會經由交換慢慢“浮”到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“冒泡排序”。

冒泡排序的算法邏輯是怎麼樣實現的?

  1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  2. 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
  3. 針對所有的元素重複以上的步驟,除了最後一個。
  4. 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較

排序過程

 


詳細是怎麼樣移動比較的,請聽娓娓道來。
假設有這樣一個數組,需要進行一場拳王爭霸賽,有編號爲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
覺得有用,可以點贊,關注,評論,留言四連發。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章