演算法之旅 | 冒泡排序法

来源:http://www.cnblogs.com/h5course/archive/2017/09/26/7597460.html
-Advertisement-
Play Games

HTML5學堂-碼匠:本期繼續走入演算法 —— 冒泡排序法。冒泡排序演算法相對簡單,容易上手,穩定性也比較高, 算是一種較好理解的演算法,也是面試官高頻提問的演算法之一。 ...


冒泡排序法

HTML5學堂-碼匠:本期繼續走入演算法 —— 冒泡排序法。冒泡排序演算法相對簡單,容易上手,穩定性也比較高, 算是一種較好理解的演算法,也是面試官高頻提問的演算法之一。

Tips:關於“演算法”及“排序”的基礎知識,在此前“選擇排序法”中已詳細講解,可點擊文後的相關文章鏈接查看,在此不再贅述。

冒泡排序法的原理

基本原理

從序列頭部開始遍歷,兩兩比較,如果前者比後者大,則交換位置,直到最後將最大的數(本次排序最大的數)交換到無序序列的尾部,從而成為有序序列的一部分;

下次遍歷時,此前每次遍歷後的最大數不再參與排序;

多次重覆此操作,直到序列排序完成。

由於在排序的過程中總是小數往前放,大數往後放,類似於氣泡逐漸向上漂浮,所以稱作冒泡排序。

原理圖解

Tips:藍色代表在一輪排序中等待交換,黑色代表在該輪排序中已交換完成,紅色代表已排序完成

演算法之旅 | 冒泡排序法 - 獨行冰海 - 獨行冰海

實現冒泡的步驟分解

使用for迴圈確定排序次數

由於待排序的序列只剩下一個數時已經能夠確定順序,則無需進行排序,因此,排序次數為序列長度 – 1。

演算法之旅 | 冒泡排序法 - 獨行冰海 - 獨行冰海

 每次排序的比較次數控制

每次排序,序列中的多個數字要分別進行兩兩比較,多次的比較需要利用for語句來進行實現。該for迴圈嵌套於排序次數的for迴圈當中(形成雙for的嵌套)。

演算法之旅 | 冒泡排序法 - 獨行冰海 - 獨行冰海

Tips:j 需要設置為小於 len - i - 1,減i的原因是已經排序完成的數不再參與比較,減1的原因是數組下標索引值從0開始。

核心功能 — 兩兩比較並根據情況交換位置

比較兩數大小,如果前者比後者大,則進行數值的交換,也就是交換位置。

演算法之旅 | 冒泡排序法 - 獨行冰海 - 獨行冰海

冒泡排序法完整代碼

演算法之旅 | 冒泡排序法 - 獨行冰海 - 獨行冰海

冒泡排序法的優化

假如序列的數據為:[0, 1, 2, 3, 4, 5];

使用上面的冒泡排序法進行排序,得到的結果肯定沒有問題,但是,待排序的序列是有序的,理論上是無需遍歷排序。

當前的演算法不管初始的序列是否有序,都會進行遍歷排序,效率會比較低,因此需要優化當前的排序演算法。

在如下的演算法中,引入一個swap變數,每一次排序之前初始化為false;若發生兩數交換位置,則將其設置為true。

在每次排序結束時候判斷swap是否為false,如果是,則說明序列已排序完成或者序列本身是有序序列,就不再進行下一次排序。

通過此方法,減少不必要的比較和位置交換,進一步提高演算法的性能。

演算法之旅 | 冒泡排序法 - 獨行冰海 - 獨行冰海

冒泡排序法的效率

時間複雜度

最佳狀態:待排序的序列本身是有序序列,排序次數根據優化後的代碼,可以得出是n-1次,時間複雜度為O(n);

最壞的情況:待排序的序列是逆序的,此時需要排序1 + 2 +3 ……(n - 1) = n(n – 1 )/2次

時間複雜度為O(n^2)。

空間複雜度

冒泡排序法需要一個額外空間(temp變數)來交換元素的位置,所以空間複雜度為O(1)。

演算法的穩定性

當相鄰元素相等時,並不需要交換位置,也就不會出現相同元素的前後順序發生改變,所以,是穩定性排序。

O是個啥?!

時間複雜度,更準確的說該是描述一個演算法在問題規模不斷增大時對應的時間增長曲線。所以,這些增長數量級並不是一個準確的性能評價,可以理解為一個近似值。(空間複雜度同理)

O(n?)表示當n很大的時候,複雜度約等於Cn?,C是某個常數,簡單說就是當n足夠大的時候,隨著n的線性增長複雜度將沿平方增長。

O(n)表示,n很大的時候複雜度約等於Cn,C是某個常數。簡言之:隨著n的線性增長,複雜度沿線性級別增長。

O(1)表示,n很大的時候,複雜度基本就不增長了。簡言之:隨著n的線性增長,複雜度不受n的影響,沿常數級別增長(此處的常數是1)。

演算法之旅 | 冒泡排序法 - 獨行冰海 - 獨行冰海

Tips:圖中O(1)緊貼著X軸,並看不太清楚。

Tips:該圖來源於“Stack Overflow”網站。

相關文章鏈接

選擇排序法

開開心心每一天

生活艱辛,代碼不易,但,不要忘記微笑!

演算法之旅 | 冒泡排序法 - 獨行冰海 - 獨行冰海

 

版權聲明:該圖來自“【美】莉茲·克裡莫 (author)”的書籍《你今天真好看》

演算法之旅 | 冒泡排序法 - 獨行冰海 - 獨行冰海
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、方法概覽 directive(name, directiveFactory) component(name, options) aHrefSanitizationWhitelist([regexp]); imgSrcSanitizationWhitelist([regexp]); debugIn ...
  • 前幾天回老家呆了幾天,幾乎沒有怎麼學習新的知識,這期間一直有斷斷續續的看《Java編程思想》,還刷了一些前沿消息,也算沒閑著。今天開始學習jQuery啦,繼續前進。 在網上查了,買了這本書。現在是一邊搜視頻,一邊看這本書。 認識jQuery,我將從以下幾方面進行講解。 一、JavaScript和Ja ...
  • 1.整體縮放 整體縮放可以用在營銷活動頁,營銷活動可能因為設計美觀需求必須使用背景圖片而非背景色,因此需要考慮背景圖適應屏幕大小。開發者可以用320像素的寬度作為基礎寬度(高度可以固定),然後通過計算實際文檔寬度來進行相應縮放。 使用整體縮放佈局開發的項目在載入過程中需要監聽resize事件,代碼如 ...
  • 接著上文線條樣式[js高手之路] html5 canvas系列教程 - 線條樣式(lineWidth,lineCap,lineJoin,setLineDash)繼續. canvas提供兩種輸出文本的方式: strokeText:描邊文本 fillText:填充文本 fillStyle配合fillTe ...
  • 本篇文章是關於覆選框的,有2種形式:1、全選、反選由2個按鈕實現;2、全選、反選由一個按鈕實現。 在實踐中碰到一個問題——check全選失效。解決辦法,使用prop方法代替attr。 這或許是和jQuery版本有關。 ...
  • 上文,寫完弧度與貝塞爾曲線[js高手之路] html5 canvas系列教程 - arcTo(弧度與二次,三次貝塞爾曲線以及線上工具),本文主要是關於線條的樣式設置 lineWidth: 設置線條的寬度,值是一個數值,如lineWidth = 5. 畫3條不同寬度的線條: lineWidth設置弧形 ...
  • 調試代碼之前,我設置了兩個緩存 分別是username和content 在控制台console設置兩個緩存代碼 localStorage.setItem('username','老王')localStorage.setItem('content','類容') 運行下麵代碼一定要先設置這兩個緩存,因為 ...
  • 自己寫了個上傳圖片的子組件,父組件需要獲取到子組件上傳的圖片地址,這裡最好的辦法是給相應的子組件加ref, 父組件在最後提交的時候獲取thi.$ref.avatar.相應數據即可,因為在這裡才能保證圖片已經上傳,否則如果圖片沒上傳,拿到的值一定為空。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...