冒泡排序進階優化

来源: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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...