[前端算法]排序算法

默認情況下,sort() 會將元素轉換為字符串,然后按照 Unicode 編碼的順序進行排序:

const fruits = ['apple', 'banana', 'cherry', 'date'];
fruits.sort();
console.log(fruits); // 輸出: ["apple", "banana", "cherry", "date"]

直接使用默認排序對數字進行排序可能會得到不符合預期的結果,因為它會按字符串比較
為了正確排序數字或實現自定義排序規則,可以向 sort() 傳遞一個比較函數
比較函數接收兩個參數(通常稱為 a 和 b),并返回一個數值:

  • 如果返回值 小于 0:a 會被排在 b 前面
  • 如果返回值 等于 0:a 和 b 的相對位置不變
  • 如果返回值 大于 0:b 會被排在 a 前面
//升序
arr.sort((a,b)=>{return a-b
})

基礎排序

冒泡排序

我們分最好、最壞和平均來看:

  • 最好時間復雜度:它對應的是數組本身有序這種情況。在這種情況下,我們只需要作比較(n-1 次),而不需要做交換。時間復雜度為 O(n)
  • 最壞時間復雜度: 它對應的是數組完全逆序這種情況。在這種情況下,每一輪內層循環都要執行,重復的總次數是 n(n-1)/2 次,因此時間復雜度是 O(n^2)
  • 平均時間復雜度:這個東西比較難搞,它涉及到一些概率論的知識。實際面試的時候也不會有面試官摁著你讓你算這個,這里記住平均時間復雜度是 O(n^2) 即可。
function bubbleSort(arr) {let len = arr.length;for (let i = 0; i < len; i++) {for(let j=0;j<len-i-1;j++){if(arr[j]>arr[j+1]){[arr[j],arr[j+1]] = [arr[j+1],arr[j]]}}}console.log(arr);}
//改進版 最好的時間復雜度 O(n)function bubbleSort2(arr) {let len = arr.length;for (let i = 0; i < len; i++) {//增加標志位let flag = false;for(let j=0;j<len-i-1;j++){if(arr[j]>arr[j+1]){flag = true;[arr[j],arr[j+1]] = [arr[j+1],arr[j]]}}//一次交換都沒發生,說明數組是有序的if(!flag){break;}}console.log(arr);}

選擇排序

選擇排序的三個時間復雜度都對應兩層循環消耗的時間量級: O(n^2)。

function selectionSort(arr) {let len = arr.length;for(let i=0;i<len;i++){for(let j=i+1;j<len;j++){if(arr[i]>arr[j]){[arr[i],arr[j]] = [arr[j],arr[i]]}}}console.log(arr);}

插入排序

插入排序的核心,找到元素在它前面的那個序列中的正確位置
正確地定位當前元素在有序序列里的位置、不斷擴大有序數組的范圍,最終達到完全排序的目的

  • 最好時間復雜度:它對應的數組本身就有序這種情況。此時內層循環只走一次,整體復雜度取決于外層循環,時間復雜度就是一層循環對應的 O(n)

  • 最壞時間復雜度:它對應的是數組完全逆序這種情況。此時內層循環每次都要移動有序序列里的所有元素,因此時間復雜度對應的就是兩層循環的 O(n^2)

  • 平均時間復雜度:O(n^2)

function insertionSort(arr) {let len = arr.length;let temp ; //保存當前變量for(let i=1;i<len;i++){temp = arr[i];let j = i;//j來幫助temp找到自己的位置while(j>0 && temp < arr[j-1]){arr[j] = arr[j-1];j--;}arr[j] = temp;}console.log(arr);}

進階排序算法

分治思想

分解子問題
求解子問題
合并子問題的解

歸并排序

歸并排序的時間復雜度就是 O(nlog(n))

  • 分解子問題:將需要被排序的數組從中間分割為兩半,然后再將分割出來的每個子數組各分割為兩半,重復以上操作,直到單個子數組只有一個元素為止。
  • 求解每個子問題:從粒度最小的子數組開始,兩兩合并、確保每次合并出來的數組都是有序的。(這里的“子問題”指的就是對每個子數組進行排序)。
  • 合并子問題的解,得出大問題的解:當數組被合并至原有的規模時,就得到了一個完全排序的數組
function mergeSort(arr) {const len = arr.length;if (len < 2) {return arr;}//計算分割點const middle = Math.floor(len / 2);//分割數組const leftArr = mergeSort(arr.slice(0, middle));const rightArr = mergeSort(arr.slice(middle, len));//合并兩個有序數組return merge(leftArr, rightArr);}
//兩個有序數組合并function merge(leftArr, rightArr) {let i = 0;let j = 0;//初始化結果數組const res = [];// 檢查 leftArr 和 rightArr 是否為 undefinedconst len1 = leftArr? leftArr.length : 0;const len2 = rightArr? rightArr.length : 0;while (i < len1 && j < len2) {if (leftArr[i] < rightArr[j]) {res.push(leftArr[i]);i++;} else {res.push(rightArr[j]);j++;}}//將剩余的數組元素添加到結果數組中while (i < len1) {res.push(leftArr[i]);i++;}while (j < len2) {res.push(rightArr[j]);j++;}return res;}

快速排序

快速排序在基本思想上和歸并排序是一致的,仍然堅持“分而治之”的原則不動搖。區別在于,快速排序并不會把真的數組分割開來再合并到一個新數組中去,而是直接在原有的數組內部進行排序。

快速排序會將原始的數組篩選成較小和較大的兩個子數組,然后遞歸地排序兩個子數組。

//快速排序 o(nlogn)function quickSort(arr,left=0,right=arr.length-1){//定義遞歸邊界,若數組只有一個元素不用排序if(arr.length > 1){//下一次劃分左右數組的索引位置const lineIndex = partition(arr,left,right);//對左子數組進行快排if(left<lineIndex-1){quickSort(arr,left,lineIndex-1);}//對右子數組進行快排if(lineIndex<right){quickSort(arr,lineIndex,right);}}return arr;}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95391.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95391.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95391.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#標簽批量打印程序開發

C#標簽批量打印程序開發&#xff08;集成Bartender解決方案&#xff09;一、系統架構設計 1. 核心模塊劃分 public class LabelPrintingSystem {private IDataLoader _dataLoader; // 數據加載器private ITemplateEngine _templateEngine; // 模板引擎private IPrintControl…

ECC的原理、背景、工作機制和數學基礎

ECC的原理、背景、工作機制和數學基礎摘要&#xff1a;本文首先詳細介紹ECC&#xff08;Error-Correcting Code&#xff0c;糾錯碼&#xff09;的原理&#xff0c;包括背景、工作機制和數學基礎。然后&#xff0c;解釋ECC在SRAM&#xff08;Static Random-Access Memory&#x…

計算機網絡2-2:物理層下面的傳輸媒體

目錄 導引型傳輸媒體 同軸電纜 雙絞線 光纖 電力線 非導引型傳輸媒體 無線電波 微波 紅外線 可見光 無線電頻譜管理機構 導引型傳輸媒體 同軸電纜 雙絞線 光纖 光在光纖中傳播的基本原理 電力線 非導引型傳輸媒體 無線電波 微波 紅外線 可見光 LiFi(可見光通信) …

Dify 從入門到精通(第 32/100 篇):Dify 的日志分析與監控

Dify 從入門到精通&#xff08;第 32/100 篇&#xff09;&#xff1a;Dify 的日志分析與監控 Dify 入門到精通系列文章目錄 第一篇《Dify 究竟是什么&#xff1f;真能開啟低代碼 AI 應用開發的未來&#xff1f;》介紹了 Dify 的定位與優勢第二篇《Dify 的核心組件&#xff1a…

【IntelliJ IDEA】修改堆內存

idea卡頓&#xff0c;鼠標漂移修改idea文件打開 idea 安裝路徑&#xff0c;【bin】目錄下【idea64.exe.vmoptions】文件修改【-Xms】最小內存【-Xmx】最大內存-Xms2048m -Xmx9216midea更改內存設置工具欄幫助更改內存設置設置堆大小上限為 文件 設置的最大內存保存并重啟Leslie…

Docker與Docker Compose:容器世界的“單兵作戰”與“軍團指揮官”

在容器化技術的浪潮中&#xff0c;Docker和Docker Compose如同“雙子星”&#xff0c;一個專注于單兵作戰&#xff0c;一個擅長軍團指揮。它們看似相似&#xff0c;卻各司其職。對于開發者來說&#xff0c;理解它們的區別不僅能讓代碼部署事半功倍&#xff0c;更能避免踩坑。本…

進階向:Python編寫自動化郵件發送程序

Python編寫自動化郵件發送程序&#xff1a;從零開始詳解在數字化時代&#xff0c;自動化郵件發送功能已成為企業和個人提升工作效率的重要工具。據統計&#xff0c;全球每天發送的商業郵件超過30億封&#xff0c;其中約40%是通過自動化系統發送的。這種功能被廣泛應用于多種場景…

ChatGpt 5系列文章1——編碼與智能體

人工智能技術正在以驚人的速度發展&#xff0c;重新定義著開發人員的工作方式。2025年8月&#xff0c;OpenAI正式發布了面向開發人員的GPT-5 一、GPT-5的編碼能力突破 GPT-5在關鍵編碼基準測試中創造了行業新紀錄(SOTA)&#xff0c;在SWE-bench Verified測試中得分74.9%&…

力扣top100(day02-05)--二叉樹 02

102. 二叉樹的層序遍歷 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right)…

開疆智能Ethernet轉ModbusTCP網關連接發那科機器人與三菱PLC配置案例

本案例是三菱FX5U PLC通過ethernet/IP轉ModbusTCP網關對發那科機器人進行控制的配置案例。PLC端主要配置以太網端口設置在通信測試中&#xff0c;PLC作為主站&#xff0c;在PLC設置中選擇“以太網端口”非常關鍵&#xff0c;以確保通信測試的正常進行。1、首先&#xff0c;在PL…

VUE+SPRINGBOOT從0-1打造前后端-前后臺系統-系統首頁

在現代Web應用開發中&#xff0c;管理后臺是幾乎所有企業級應用不可或缺的部分。一個優秀的后臺首頁不僅需要提供清晰的信息展示&#xff0c;還需要具備良好的用戶體驗和視覺效果。本文將詳細介紹如何使用Vue.js框架配合Element UI組件庫和ECharts圖表庫&#xff0c;構建一個功…

第6節 torch.nn介紹

6.1 torch.nn.Module介紹 torch.nn.Module是 PyTorch 中構建神經網絡的基礎類&#xff0c;所有的神經網絡模塊都應該繼承這個類。它提供了一種便捷的方式來組織和管理網絡中的各個組件&#xff0c;包括層、參數等&#xff0c;同時還內置了許多用于模型訓練和推理的功能。 官網…

python自學筆記7 可視化初步

圖像的組成工具庫 Matplotlib&#xff1a;繪制靜態圖 Plotly: 可以繪制交互式圖片 圖像的繪制&#xff08;Matplotlib&#xff09; 創建圖形&#xff0c;軸對象 創造等差數列 # 包含后端點 arr np.linspace(0, 1, num11) # 不包含后端點 arr_no_endpoint np.linspace(0, 1, n…

GIS 常用的矢量與柵格分析工具

矢量處理工具作用典型應用緩沖區分析Buffer環境影響區域&#xff0c;空間鄰近度分析等&#xff0c;例如道路周圍一公里內的學校&#xff0c;噪音污染影響的范圍裁剪Clip例如使用A市圖層裁剪全國道路數據&#xff0c;獲取A市道路數據交集Intersect識別與LUCC、分區洪水區、基礎設…

http與https協議區別;vue3本地連接https地址接口報500

文章目錄問題解決方案一、問題原因分析二、解決方案詳解1. 保持當前配置&#xff08;推薦臨時方案&#xff09;2. 更安全的方案&#xff08;推薦&#xff09;3. 環境區分配置&#xff08;最佳實踐&#xff09;三、為什么開發環境不用配置&#xff1f;問題 問題&#xff1a;本地…

C語言——深入理解指針(三)

C語言——深入理解指針&#xff08;三&#xff09; 1.回調函數是什么&#xff1f; 首先我們來回顧一下函數的直接調用&#xff1a;而回調函數就是通過函數指針調用的函數。我們將函數的指針&#xff08;地址&#xff09;作為參數傳遞給另一個函數&#xff0c;當這個指針被用來調…

kettle 8.2 ETL項目【四、加載數據】

一、dim_store表結構,數據來源于業務表,且隨時間會有增加,屬于緩慢變化維(SCD)類型二 轉換步驟如下 詳細步驟如下

【測試報告】SoundWave(Java+Selenium+Jmeter自動化測試)

一、項目背景 隨著數字音樂內容的爆炸式增長&#xff0c;用戶對于便捷、高效的音樂管理與播放需求日益增強。傳統的本地音樂管理方式已無法滿足多設備同步、在線分享與個性化推薦等現代需求。為此&#xff0c;我們設計并開發了一款基于Spring Boot框架的SoundWave&#xff0c;旨…

C++ 類和對象詳解(1)

類和對象是 C 面向對象編程的核心概念&#xff0c;它們為代碼提供了更好的封裝性、可讀性和可維護性。本文將從類的定義開始&#xff0c;逐步講解訪問限定符、類域、實例化、對象大小計算、this 指針等關鍵知識&#xff0c;并對比 C 語言與 C 在實現數據結構時的差異&#xff0…

奈飛工廠:算法優化實戰

推薦系統的算法邏輯與優化技巧在流媒體行業的 “用戶注意力爭奪戰” 中&#xff0c;推薦系統是決定成敗的核心武器。對于擁有2.3 億全球付費用戶的奈飛&#xff08;Netflix&#xff09;而言&#xff0c;其推薦系統每天處理數十億次用戶交互&#xff0c;最終實現了一個驚人數據&…