javascript數組(1) ——sort的工作原理及其他數組排序方法

来源:http://www.cnblogs.com/weven/archive/2017/07/25/7217988.html
-Advertisement-
Play Games

一說到數組排序,最直觀的想法就是用sort啊! 請問不用使用sort方法還可以使用什麼方法進行數組排序? 比如 : 快速排序法、合併排序法、冒泡排序法、選擇排序法、插入排序法、布爾排序法、交互排序、選擇排序、二分法排序..... 等等一下,在我們瞭解這些排序方法之前,為了更好的理解,先讓我們探索一下 ...


一說到數組排序,最直觀的想法就是用sort啊!

請問不用使用sort方法還可以使用什麼方法進行數組排序?

比如 :  快速排序法、合併排序法、冒泡排序法、選擇排序法、插入排序法、布爾排序法、交互排序、選擇排序、二分法排序.....

等等一下,在我們瞭解這些排序方法之前,為了更好的理解,先讓我們探索一下sort的工作原理

//  sort()方法:按照字元編碼的順序進行排序
     var arr = [11,15,20,1000,25,2,40]
     arr.sort();          // [1000, 11, 15, 2, 20, 25, 40]

//  sort()的兩種使用方法:
//  1.不帶參數,比較字元串字母的排序
     var alpha =["I","L","O","V","E","W","E","B"]
     alpha.sort();      //["B", "E", "E", "I", "L", "O", "V", "W"]
 
//  2.帶參數,比較數字或大小
     var arr1 = [11,15,20,1000,25,2,40]
     function order (a,b){
           if(a>b){return 100;}   
           if(a<b){return -100;}  
           if(a==b){return 0;}   
     }
//  此方法還可以簡化
    function order (a,b){
           return a-b
     }
//  a,b  分別取值進行比較,當a>b時為正數,當a<b時為負數,當a=b時為零。
     arr.sort(order);    //[2, 11, 15, 20, 25, 40, 1000]

 舉了上面一系列的例子,相信大家對sort排序也有了初步的認知。那麼,sort排序的工作原理是什麼呢?

工作原理:先比較第一個和第二個排序,再比較第三個,以此類推

下麵我們來說說其他排序方法,並且比較程式的運行速度

 

快速排序法

快速排序使用分治法來把一個串(list)分為兩個子串(sub-lists)。具體演算法描述如下:

(1)在數據集之中,選擇一個元素作為"基準"(pivot)。

(2)所有小於"基準"的元素,都移到"基準"的前面;所有大於"基準"的元素,都移到"基準"的後面。在這個分區退出之後,該基準就處於數列的中間位置。這個稱為分區(partition)操作;

(3)遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

function quicksort(arr){
    if(arr.length == 0){return arr;}
    var pivot =arr[0];
    var left =new Array();
    var right = new Array();
    for (var i=1;i<arr.length;i++){
        if(arr[i]<pivot){
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }
    return quicksort(left).concat(pivot,quicksort(right));

}
console.time('快速排序Tiem');
console.log(quicksort(arr));
console.timeEnd('快速排序Tiem');

 

合併排序法

如果列表的長度為0或1,那麼它已被排序。除此以外:

(1)將未排序的列表劃分為大約一半大小的兩個子列表。

(2)通過重新應用合併排序來遞歸地排序每個子列表。

(3)將兩個子列表合併成一個排序列表。

function mergeSort(arr){
    if (arr.length < 2)
        return arr;
    var middle = parseInt(arr.length / 2);
    var left   = arr.slice(0, middle);
    var right  = arr.slice(middle, arr.length);
    return merge(mergeSort(left), mergeSort(right));
}
 
function merge(left, right){
    var result = [];
    while (left.length && right.length) {
        if (left[0] <= right[0]) {
            result.push(left.shift());
        } else {
            result.push(right.shift());
        }
    } 
    while (left.length)
        result.push(left.shift());
 
    while (right.length)
        result.push(right.shift());
 
    return result;
}
console.time('合併排序Tiem');
console.log(mergeSort(arr));
console.timeEnd('合併排序Tiem');

 

冒泡排序法

具體演算法描述如下:

(1)比較相鄰的元素。如果第一個比第二個大,就交換它們兩個;

(2)對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對,這樣在最後的元素應該會是最大的數;

(3)針對所有的元素重覆以上的步驟,除了最後一個;

(4)重覆步驟 (1)(3)(1)(3),直到排序完成。

function bubbleSort(arr) {
    var i = 0,
    len = arr.length,
    j, d;
    for (; i < len; i++) {
        for (j = 0; j < len; j++) {
            if (arr[i] < arr[j]) {
                d = arr[j];
                arr[j] = arr[i];
                arr[i] = d;
            }
        }
    }
    return arr;
}
console.time('冒泡排序Tiem');
console.log(bubbleSort(arr));
console.timeEnd('冒泡排序Tiem');

 排序方法還有很多,在這裡就不一一詳解了,想瞭解更多可以查閱javascript排序演算法彙總(寫的很不錯的哦~!)

最後為大家推薦一個日本程式員norahiko,寫的排序動畫站,希望能夠對數組排序的學習有所幫助๑乛◡乛๑


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

-Advertisement-
Play Games
更多相關文章
  • <canvas>標簽定義了一塊畫布,畫布可以在網頁中繪製2D和3D圖象,現在先學習如何繪製2D圖象,繪製3D圖象屬於WebGL的內容(也就是網頁版的OpenGL,3D圖形介面)。 屬性 <canvas>只有width和height兩個屬性。如果沒有設置width和height屬性,canvas的預設 ...
  • Layout Controls Auto Layout Ext JS4中的容器的預設佈局是自動佈局。這個佈局管理器會自動地將組件放在一個容器中。 Fit Layout Fit佈局安排了容器的內容完全占據空間,它適合於容器的大小。Fit佈局通常用於具有單個項目的容器。Fit佈局是Card佈局的基類 A ...
  • //settime($("#getPhoneCode"),60); function settime($obj, time) { if (time == 0) { $obj.attr("disabled", false); $obj.css("background", "#f38401").css(... ...
  • jquery table 元素操作-創建|數據填充|重置|隱藏行 ...
  • [1]基本用法 [2]多行字元串 [3]變數占位符 [4]標簽模板 [5]raw() ...
  • /* 此文不斷更新中 */ 使用 .col-md-offset-* 類可以將列向右側偏移 ...
  • 倒計時主要用到的知識點:1、設置時間間隔的setInterval可以被clearInterval取消 2、毫秒轉換為時分格式 這個是效果圖 下麵是js中的函數 第二個是html資源,為了方便我css直接寫在html中了 需要代碼的小伙伴可以自行下載 鏈接:http://pan.baidu.com/s ...
  • 【來源】由於自己非電腦出身,所以對於底層的一些常識的認識不夠;近期開始自修《網易雲課堂》的大學四年電腦,碰到了一個通過三角函數計算角度的問題;為了讓自己重溫三角函數知識,引出了之後一些列的實踐和思考,而且最後我用的非三角函數知識; 【思考】對於時鐘這種插件,《慕課網》上有很多講解,也看了一些,怎 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...