冒泡排序進階優化

来源:https://www.cnblogs.com/webdragon/archive/2019/02/24/10427438.html
-Advertisement-
Play Games

冒泡排序的思想:我們以升序排列為例,所謂冒泡排序就是在無序數組中每執行一趟選出這一趟中最大的數放在最後面,第二趟選出次大的數放在倒數第二位上,直到完成排序。以此類推降序就是將小的數放在後面排序。代碼如下: 方法(一) 運行圖: 方法(二) 主要還是對方法一的優化,設置一個標誌,如果這一趟下來發生了交 ...


冒泡排序的思想:我們以升序排列為例,所謂冒泡排序就是在無序數組中每執行一趟選出這一趟中最大的數放在最後面,第二趟選出次大的數放在倒數第二位上,直到完成排序。以此類推降序就是將小的數放在後面排序。代碼如下: 

方法(一)

 1   var arr = [6, 5, 3, 4, 1, 2];
 2     function sort(arr) {
 3         var maxNum= arr.length - 1;
 4         // 遍曆數組,次數就是arr.length - 1
 5         for (var i = 0; i < maxNum- 1; i++) {
 6             // 這裡根據外層for迴圈的i,逐漸減少內層 for迴圈j的次數所以要減i。
 7             for (var j = 0; j < maxNum-i; j++) {
 8                 if (arr[j] > arr[j + 1]) {
 9                     //設置第三方變數(x)來用於數據交換,且這個變數放在迴圈的外面性能要好,兩兩對比,把大的數放在後面。
10                     var x = arr[j + 1];
11                     arr[j + 1] = arr[j];
12                     arr[j] = x;
13                     // 利用加法來實現兩個數據的交換
14                     // arr[j] = arr[j] + arr[j+1];
15                     // arr[j+1] = arr[j] - arr[j+1];
16                     // arr[j] = arr[j] - arr[j+1];
17                     // 利用位運算實現兩個數據的交換
18                     //arr[j] = arr[j]^arr[j+1];
19                     //arr[j+1] = arr[j]^arr[j+1];
20                     //arr[j] = arr[j]^arr[j+1];
21                 }
22             }
23             console.log("第" + (i + 1) + "次排序後的數組是" + arr);
24         }
25     }
26     sort(arr);
27     console.log(arr);

運行圖:

方法(二)

主要還是對方法一的優化,設置一個標誌,如果這一趟下來發生了交換,則為true,否則為false。如果有一趟下來沒有發生交換,則說明排序已經完成。代碼如下:

 1  var arr = [3, 2, 1, 4,5,6];
 2     function sort(arr) {
 3         var maxNum= arr.length - 1;
 4         // 遍曆數組,次數就是arr.length - 1
 5         for (var i = 0; i < maxNum- 1; i++) {
 6             // 聲明一個變數,作為標誌位
 7             var done = true;
 8             // 這裡根據外層for迴圈的i,逐漸減少內層 for迴圈j的次數所以要減i。
 9             for (var j = 0; j < maxNum-i; j++) {
10                 if (arr[j] > arr[j + 1]) {
11                     //設置第三方變數(x)來用於數據交換,且這個變數放在迴圈的外面性能要好,兩兩對比,把大的數放在後面。
12                     var x = arr[j + 1];
13                     arr[j + 1] = arr[j];
14                     arr[j] = x;
15                     // 利用加法來實現兩個數據的交換
16                     // arr[j] = arr[j] + arr[j+1];
17                     // arr[j+1] = arr[j] - arr[j+1];
18                     // arr[j] = arr[j] - arr[j+1];
19                     // 利用位運算實現兩個數據的交換
20                     //arr[j] = arr[j]^arr[j+1];
21                     //arr[j+1] = arr[j]^arr[j+1];
22                     //arr[j] = arr[j]^arr[j+1];
23                     done = false;
24                 }
25             }
26             if (done) {
27                 break;
28             }
29             console.log("第" + (i + 1) + "次排序後的數組是" + arr);
30         }
31     }
32     sort(arr);
33     console.log(arr);

運行圖:

 

  方法(三)

      是對前兩種方式的進一步優化,假如數組長度是30,如果只有前15位是無序排列的,後十五位是有序且都大於前15位,所以第一趟遍歷排序的時候發生交換的位置必定小於15,且該位置之後的必定有序,我們只需要排序好該位置之前的就可以,因此我們要來標記這個位置就可以了,代碼如下:

 1  var arr = [3, 2, 1, 4, 5, 6];
 2 
 3     function sort(arr) {
 4         var n = arr.length;
 5         var j, k;
 6         var flag = n;
 7         while (flag > 0) {
 8             k = flag;
 9             flag = 0;
10             for (j = 1; j < k; j++) {
11                 if (arr[j - 1] > arr[j]) {
12                     x = arr[j - 1];
13                     arr[j - 1] = arr[j];
14                     arr[j] = x;
15                     flag = j;
16                 }
17             }
18         }
19     }
20     sort(arr);
21     console.log(arr);

 

 總結分析:

         1.比較相鄰的兩個元素,如果前一個比後一個大(小),則交換位置。

   2.第一輪的時候最後一個元素應該是最大(最小)的一個。

   3.按照步驟一的方法進行相鄰兩個元素的比較,這個時候由於最後一個元素已經是最大(最小)的了,所以最後一個元素不用比較。

 

 



 



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們知道一般圖書館都會建書目索引,可以提高數據檢索的效率,降低資料庫的IO成本。MySQL在300萬條記錄左右性能開始逐漸下降,雖然官方文檔說500~800w記錄,所以大數據量建立索引是非常有必要的。MySQL提供了Explain,用於顯示SQL執行的詳細信息,可以進行索引的優化。 一、導致SQL執 ...
  • Redis常用數據類型有字元串String、字典disct、列表List、集合Set、有序集合SortedSet,List常用於獲取最新topN條新聞等類似問題和生產者消費者模式,集合set可以求對象的共同標簽,而有序集合SortedSet用於游戲中的分數排名,SortedSet底層採用壓縮列表zi... ...
  • 一、獲取SDK 1.進入ArcFace2.0的申請地址 https://ai.arcsoft.com.cn/product/arcface.html 2.填寫信息申請並提交 申請通過後即可下載SDK,查看APP_ID和SDK_KEY 二、功能介紹 虹軟ArcFace 2.0 Android包含人臉檢 ...
  • 最近面試時,面試官問了一個列表倒計時效果如何實現,然後腦袋突然懵的了O(∩_∩)O,現在記錄一下。 運行效果圖 實現思路 實現方法主要有兩個: 1.為每個開始倒計時的item啟動一個定時器,再做更新item處理; 2.只啟動一個定時器,然後遍曆數據,再做再做更新item處理。 經過思考,包括性能、實 ...
  • 前言 Android常用知識體系是什麼鬼?所謂常用知識體系,就是指對項目中重覆使用率較高的功能點進行梳理。註意哦,不是Android知識體系。 古語道:學而不思則罔,思而不學則殆。如果將做項目類比為“學”,那麼整理就可以類比為“思”。 在做項目過程中總是會遇到使用相同的功能,比如toast、對話框、 ...
  • 對於經常逛商場的MM來說,哪裡有什麼商店,停車在哪裡,電梯、廁所在哪裡,找這些都是一些費力的事情,如果有一個商場地圖可以整體全局預覽,那是很方便的。目前就根據商場停車項目需求,先如何找到一個商場停車場車位的事情說起。商場停車場車位管理系統其實上是一個很大的系統,首先需要從車位是否被占用的事情說起,方... ...
  • 好久沒寫東西,博客又長草了,這段時間身心放鬆了好久,都沒什麼主題可以寫了 上周接到一個需求,優化vue的一個長列表頁面,忙活了很久也到尾聲了,記憶體使用和卡頓都做了一點點優化,還算有點收穫 寫的有點啰嗦,可以看一下我是怎麼進行這個優化的,也許有點幫助呢 這個長列表頁面,其實是一個實時日誌上報的頁面,隨 ...
  • VSCode中有一些快捷編輯HTML的方法,能大大提高工作效率,在這記錄一些。 1.輸入html:5,然後按tab鍵或enter鍵,效果如下: 2.輸入link:css引入css樣式文件,輸入script:src引入js 3.輸入標簽名自動補齊 4.隨機文本的輸入 5.使用"#"輸入id,"."輸入 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...