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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...