JavaScript實現常用的排序演算法

来源:http://www.cnblogs.com/qqandfqr/archive/2016/12/23/6213341.html
-Advertisement-
Play Games

1、冒泡排序 2、快速排序 3、直接插入排序 4、希爾排序 5、直接選擇排序 ...


▓▓▓▓▓▓ 大致介紹

  由於最近要考試複習,所以學習js的時間少了 -_-||,考試完還會繼續的努力學習,這次用原生的JavaScript實現以前學習的常用的排序演算法,有冒泡排序、快速排序、直接插入排序、希爾排序、直接選擇排序

 

▓▓▓▓▓▓ 交換排序

  交換排序是一類在排序過程中藉助於交換操作來完成排序的方法,基本思想是兩兩比較排序記錄的關鍵字,如果發現兩個關鍵字逆序,則將兩個記錄位置互換,重覆此過程,直到該排序列中所有關鍵字都有序為止,接下來介紹交換排序中常見的冒泡排序快速排序

 

▓▓▓▓▓▓ 冒泡排序

  冒泡排序的名字由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端,故名

  冒泡排序演算法的運作如下:(從後往前)
  1、比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
    2、對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
  3、針對所有的元素重覆以上的步驟,除了最後一個。
  4、持續每次對越來越少的元素重覆上面的步驟,直到沒有任何一對數字需要比較。

  冒泡排序的時間複雜度是 O(n^2)

  代碼:

 1         // 冒泡排序
 2         function bubbleSort(arr){
 3 
 4             for(var i=0;i<arr.length;i++){
 5                 for(var j=0;j<arr.length-i-1;j++){
 6                     if(arr[j] > arr[j+1]){
 7                         var arrMax = arr[j+1];
 8                         arr[j+1] = arr[j];
 9                         arr[j] = arrMax;
10                     }
11                 }
12             }
13 
14             return arr;
15         }

 

▓▓▓▓▓▓ 快速排序 

  快速排序(Quicksort)是對冒泡排序的一種改進。     快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數       據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。     一趟快速排序的演算法是:   1)設置兩個變數i、j,排序開始的時候:i=0,j=N-1;   2)以第一個數組元素作為關鍵數據,賦值給key,即key=A[0];   3)從j開始向前搜索,即由後開始向前搜索(j--),找到第一個小於key的值A[j],將A[j]和A[i]互換;   4)從i開始向後搜索,即由前開始向後搜索(i++),找到第一個大於key的A[i],將A[i]和A[j]互換;   5)重覆第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小於key,4中A[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為              止。找到符合條件的值,進行交換的時候i, j指針位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束)。     快速排序的時間複雜度是O(n*logn)     代碼:
 1         // 快速排序
 2         function quickSort(arr){
 3             // 結束遞歸條件
 4             if(arr.length <= 1){
 5                 return arr;
 6             }
 7 
 8             var left = [];
 9             var right = [];
10             var key = arr[0];
11 
12             // 分組
13             for(var i=1;i<arr.length;i++){
14                 if(arr[i] < key){
15                     left.push(arr[i]);
16                 }else{
17                     right.push(arr[i]);
18                 }
19             }
20 
21             // 遞歸分組
22             return quickSort(left).concat(key,quickSort(right));
23         }

 

 

▓▓▓▓▓▓ 插入排序

  插入排序的基本思想是:每次將一個待排序的記錄,按其關鍵字大小插入到前面已經排序的序列中的適當位置,直到全部記錄插入完成為止,接下來介紹兩種常用的插入排序方法:直接插入排序希爾排序

 

▓▓▓▓▓▓ 直接插入排序

  直接插入排序(straight insertion sort)的做法是:   每次從無序表中取出第一個元素,把它插入到有序表的合適位置,使有序表仍然有序。第一趟比較前兩個數,然後把第二個數按大小插入到有序表中; 第二趟把第         三個數據與前兩個數從後向前掃描,把第三個數按大小插入到有序表中;依次進行下去,進行了(n-1)趟掃描以後就完成了整個排序過程。      直接插入排序的時間複雜度為      代碼:
 1         // 直接插入排序
 2         function insertSort(arr){
 3             // 預設第一個元素是有序的
 4             for(var i=1;i<arr.length;i++){
 5 
 6                 if(arr[i] < arr[i-1]){
 7                     var guard = arr[i];
 8                     var j = i - 1;
 9                     // 將有序數組擴大一位
10                     arr[i] = arr[j];
11 
12                     //遍歷有序組,找到自己的位置
13                     while(j >= 0 && guard < arr[j]){
14                         arr[j+1] = arr[j];
15                         j--;
16                     }
17 
18                     // 插入檢查的元素
19                     arr[j+1] = guard;
20                 }
21             }
22             return arr;
23         }

 

▓▓▓▓▓▓ 希爾排序

  希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因DL.Shell於1959年提出      而得名。  

  希爾排序屬於插入類排序,是將整個有序序列分割成若幹小的子序列分別進行插入排序。   排序過程:先取一個正整數d1<n,把所有序號相隔d1的數組元素放一組,組內進行直接插入排序;然後取d2<d1,重覆上述分組和排序操作;直至di=1,即所有       記錄放進一 個組中排序為止。     希爾排序的時間複雜度為時間複雜度O(n*logn)     代碼:
 1         // 希爾排序
 2         function shellSort(arr){
 3             var len = arr.length;
 4             var stepLen = 1;
 5             // 確定首次遍歷的步長
 6             while(stepLen < len/3){
 7                 stepLen = 3*stepLen + 1;
 8             }
 9             // 開始遍歷
10             while(stepLen >= 1){
11                 for(var i=stepLen;i<len;i++){
12                     for(var j=i;j>=stepLen && arr[j] < arr[j-stepLen];j-=stepLen){
13                         swap(arr,j,j-stepLen);
14                     }
15                 }
16                 stepLen = (stepLen - 1)/3;
17             }
18 
19             return arr;
20         }
21 
22         function swap(arr,i,j){
23             var temp = arr[j];
24             arr[j] = arr[i];
25             arr[i] = temp;
26         }

 

▓▓▓▓▓▓ 選擇排序

  選擇排序的基本思想是:每一趟排序在n-i+1個帶排序記錄中選出關鍵字最小的記錄,作為有序序列的第i個記錄,直到全部記錄排序完畢。常用的排序方法有直接選擇排序堆排序(由於js不能很好的體現堆排序的特點就不寫了)

  

▓▓▓▓▓▓ 直接選擇排序

  基本思想是:第一次從R[0]~R[n-1]中選取最小值,與R[0]交換,第二次從R[1]~R[n-1]中選取最小值,與R[1]交換,....,第i次從R[i-1]~R[n-1]中選取最小值,與R[i-1]交換,.....,第n-1次從R[n-2]~R[n-1]中選取最小值,與R[n-2]交換,總共通過n-1次,得到一個按排序碼從小到大排列的有序序列

  直接選擇排序的時間複雜度:O(n^2)

  代碼:

 1         // 直接選擇排序
 2         function straightSelectSort(arr){
 3             // 預設第一個元素是最小的
 4             var min;
 5             var k;
 6             var lArr = [];
 7             for(var i=0;i<arr.length-1;i++){
 8                 min = arr[i];
 9                 k = i;
10                 for(var j=i+1;j<arr.length;j++){
11                     if(arr[j] < min){
12                         min = arr[j];
13                         k = j;
14                     }
15                 }
16                 if(k != i){
17                     arr[k] = arr[i];
18                     arr[i] = min;
19                 }
20             }
21             return arr;
22         }

 


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

-Advertisement-
Play Games
更多相關文章
  • ·核心作用: -保證一個類只有一個實例,並且提供一個訪問該實例的全局訪問點。 ·常見應用場景: -Windows的Task Manager(任務管理器)就是很典型的單例模式 -Windows的Recycle Bin(回收站)也是很典型的單例應用。在整個系統運行過程中,回收站一直維護著僅有的一個實例 ...
  • 創建型模式:-單例模式、工廠模式、抽象工廠模式、建造者模式、原型模式結構型模式:-適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式行為型模式:-模板方法模式、命令模式、迭代器模式、觀察者模式、中介者模式、備忘錄模式、解釋器模式、狀態模式、策略模式、職責鏈模式、訪問者模式 ...
  • 關於Prometheus Prometheus是一套開源的監控系統,它將所有信息都存儲為時間序列數據;因此實現一種Profiling監控方式,實時分析系統運行的狀態、執行時間、調用次數等,以找到系統的熱點,為性能優化提供依據。 監控方式 程式代碼收集運行數據寫入到redis,通過API介面開放給Pr ...
  • 一、緣起 分散式環境下,多台機器上多個進程對一個數據進行操作,如果不做互斥,就有可能出現“餘額扣成負數”,或者“商品超賣”的情況,如何實現簡易分散式鎖,對分散式環境下的臨界資源做互斥,是今天將要討論的話題。 二、互斥原理 原理:多個訪問方對同一個資源進行操作,需要進行互斥,通常是利用一個這些訪問方同 ...
  • 前面的話   一個完整的HTML文檔必須包含3個部分:文檔聲明、文檔頭部和文檔主體。而正是它們構成了HTML的骨架結構。前面已經分別介紹過文檔聲明和文檔頭部,本文將詳細介紹構成HTML骨架結構的基礎元素   HTML    與``標簽限定了文檔的開始 ...
  • 這是React井字棋項目的最後一篇筆記,記述AI實現。 一. 是開頭都會說的原理 但凡懂一點圍棋的人都知道“大場”這個概念,可以淺顯地把它理解為佈局時棋盤上各處的要點。棋諺“金角銀邊草肚皮”,就很好地說明瞭大場具有的特征:價值高。 比如沒其他子的情況下,先手占星角位,這手棋價值大約是20目。第一手下 ...
  • display:box 使子元素成行排列如果父級寬度小於子級盒子 不會把超出部分擠出下麵 而是直接超出 -box-orient:vertical 使盒子垂直顯示 預設水平顯示 -box-direction:Reverse使盒子排列順序顛倒; -box-ordinal-group: ;設置元素排列的具 ...
  • 快速排序(Quicksort)是對冒泡排序的一種改進。快速排序由C. A. R. Hoare在1962年提出。 它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...