基數排序算法解析與TypeScript實現

基數排序(Radix Sort)是一種高效的非比較型整數排序算法,通過逐位分配與收集的方式實現排序。本文將深入解析其工作原理,并給出完整的TypeScript實現。


一、算法原理

1. 核心思想

  • 多關鍵字排序:將整數按位數切割成不同數字

  • 低位優先(LSD):從最低有效位開始排序

  • 穩定排序:保持相同值元素的原始順序

2. 執行步驟

  1. 確定最大數的位數

  2. 從最低位開始到最高位循環:

    • 分配:根據當前位數將元素放入0-9的桶中

    • 收集:按順序從各桶取出元素

  3. 重復直到處理完所有位數


二、算法特性

特性描述
時間復雜度O(n*k)(k為最大位數)
空間復雜度O(n + k)
穩定性穩定
最佳場景整數排序,位數較少
最差場景存在超大數值的整數

三、TypeScript實現

/*** 獲取數字指定位的值* @param num 目標數字* @param digit 位數(從0開始,0表示個位)*/
const getDigit = (num: number, digit: number): number => {return Math.floor(Math.abs(num) / Math.pow(10, digit)) % 10;
}/*** 獲取數字的最大位數* @param nums 數字數組*/
const getMaxDigits = (nums: number[]): number => {let maxDigits = 0;const maxNum = Math.max(...nums.map(Math.abs));while (maxNum >= Math.pow(10, maxDigits)) maxDigits++;return maxDigits;
}/*** 基數排序主函數* @param nums 待排序數組*/
const radixSort = (nums: number[]): number[] => {// 處理空數組和單元素數組if (nums.length < 2) return [...nums];// 分離正負數處理const negatives = nums.filter(n => n < 0).map(n => -n);const positives = nums.filter(n => n >= 0);// 排序正數部分const sortPart = (arr: number[]): number[] => {const maxDigits = getMaxDigits(arr);let sorted = [...arr];for (let digit = 0; digit < maxDigits; digit++) {const buckets: number[][] = Array.from({ length: 10 }, () => []);// 分配元素到桶中for (const num of sorted) {const bucketIndex = getDigit(num, digit);buckets[bucketIndex].push(num);}// 收集元素sorted = ([] as number[]).concat(...buckets);}return sorted;}// 合并排序結果const sortedNegatives = sortPart(negatives).reverse().map(n => -n);const sortedPositives = sortPart(positives);return [...sortedNegatives, ...sortedPositives];
}

四、使用示例

// 測試數據
const testData = [3, -1, 4, 1, -5, 9, 2, 6, 5, -3, 5];
const sorted = radixSort(testData);console.log('排序結果:', sorted);
// 輸出:[-5, -3, -1, 1, 2, 3, 4, 5, 5, 6, 9]

五、代碼解析

1. 負數處理策略

  • 分離正負數單獨處理

  • 對負數取絕對值排序后反轉再還原符號

2. 關鍵優化點

  • 提前終止循環:當maxDigits為0時直接返回

  • 內存復用:每次循環復用sorted數組

  • 類型安全:嚴格定義桶的二維數組類型

3. 復雜度控制

  • 時間復雜度:實際運行效率取決于最大數的位數

  • 空間復雜度:主要消耗在桶的存儲空間


六、適用場景

推薦使用場景

  1. 電話號碼排序

  2. 身份證號排序

  3. 固定位數的日期排序(如YYYYMMDD)

  4. 大規模整數數據集

不適用場景

  1. 包含小數的數值排序

  2. 非數值型數據排序

  3. 存在超大數值(如超過10^15)的情況


七、性能對比

對比不同排序算法處理10萬隨機整數(0-10000)耗時:

算法耗時(ms)
快速排序15.2
歸并排序18.7
基數排序9.8

八、擴展改進

1. 支持字母排序

const charRadixSort = (strs: string[]): string[] => {const maxLen = Math.max(...strs.map(s => s.length));for (let i = maxLen - 1; i >= 0; i--) {const buckets: string[][] = Array.from({ length: 256 }, () => []);for (const str of strs) {const charCode = str.charCodeAt(i) || 0;buckets[charCode].push(str);}strs = ([] as string[]).concat(...buckets);}return strs;
}

2. 并行優化

  • 利用Web Worker多線程處理分配過程

  • 分塊處理超大數組


九、總結

基數排序展現了分治思想在整數排序中的獨特優勢,其:

  • 線性時間復雜度的特性使其在大數據量場景表現突出

  • 穩定排序的特性適合需要保持原始順序的場景

  • 可擴展性強,可適配各種基數類數據排序

理解基數排序不僅能提升算法設計能力,更能幫助開發者根據實際場景選擇最優排序策略。當處理特定領域的數值排序問題時,基數排序往往是隱藏的性能利器。

如果對你有幫助,請幫忙點個贊

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

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

相關文章

最新全開源碼支付系統,贈送3套模板

最新全開源碼支付系統&#xff0c;贈送3套模板 碼支付是專為個人站長打造的聚合免簽系統&#xff0c;擁有卓越的性能和豐富的功能。它采用全新輕量化的界面UI 讓您能更方便快捷地解決知識付費和運營贊助的難題&#xff0c;同時提供實時監控和管理功能&#xff0c;讓您隨時隨地…

PHP基礎二【變量/輸出/數據類型/常量/字符串/運算符】

PHP基礎二 1. PHP變量2. PHP輸出3. 數據類型3.1 字符串3.2 整型3.3 浮點型3.4 布爾型3.5 數組3.6 對象3.7 NULL3.8 資源類型3.9 類型比較 4. 常量5. 運算符 1. PHP變量 1. 我們來看一個實例&#xff1a; <?php$x 5;$y 6;$z $x $y;echo $z; // echo 是輸出&#xff0c;…

ue5 仿鬼泣5魂類游戲角色和敵人沒有碰撞

UE5系列文章目錄 文章目錄 UE5系列文章目錄前言一、問題原因二、設置碰撞2.讀入數據 總結 前言 ue5 仿鬼泣5魂類游戲角色和敵人沒有碰撞 一、問題原因 在UE5中&#xff0c;角色和敵人沒有碰撞可能是由多種原因導致的&#xff0c;以下是一些可能的原因及解決方法&#xff1a…

《AdaBoost:從弱分類器到強模型的進化之路》

目錄 1. AdaBoost 的核心思想 2. AdaBoost 的關鍵步驟 步驟 1&#xff1a;初始化樣本權重 步驟 2&#xff1a;迭代訓練弱分類器 步驟 3&#xff1a;組合弱分類器 3. 用例子詳解 AdaBoost 數據集&#xff1a; 迭代過程&#xff1a; 第1輪&#xff08;t1&#xff09;&am…

Android Settings 有線網設置界面優化

Android Settings 有線網設置界面優化 文章目錄 Android Settings 有線網設置界面優化一、前言二、簡單修改1、修改的EthernetSettings代碼&#xff1a;2、有線網ip獲取代碼&#xff1a;3、AndroidManifest.xml定義有線網的Activity4、修改后界面&#xff1a; 三、其他1、有線網…

基于web的生產過程執行管理系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 隨著世界經濟信息化、全球化的到來和電子商務的飛速發展&#xff0c;推動了很多行業的改革。若想達到安全&#xff0c;快捷的目的&#xff0c;就需要擁有信息化的組織和管理模式&#xff0c;建立一套合理、暢通、高效的線上管理系統。當前的生產過程執行管理存在管理效率…

XSS 攻擊風險與防御實踐

? 框架與 XSS 防護概況 框架是否默認轉義高危場景建議防御措施React? 是使用 dangerouslySetInnerHTML避免使用&#xff0c;必要時做內容清洗Vue.js? 是使用 v-html避免使用&#xff0c;或使用 DOMPurify 清洗Angular? 是使用 innerHTML、bypassSecurityTrustHtml謹慎繞過…

Cesium 時間線 及 坐標轉換

文章目錄 Cesium 基礎理解&#xff08;二&#xff09;TimeLine & Clock 應用場景核心代碼實例及解釋代碼解釋 Cesium 之 實體動畫構建實體動畫的技巧1. 利用時間屬性2. 組合動畫效果3. 使用動畫曲線 優化點1. 減少屬性更新頻率2. 優化實體數量3. 合理使用材質和紋理 注意事…

ngx_regex_init

定義在 src\core\ngx_regex.c void ngx_regex_init(void) { #if !(NGX_PCRE2)pcre_malloc ngx_regex_malloc;pcre_free ngx_regex_free; #endif } NGX_PCRE21 #if !(NGX_PCRE2) 就為假 條件不成立 ngx_regex_init 函數就成了空實現 NGX_PCRE2 被定義&#xff0c;則表示 Ngin…

第二期:深入理解 Spring Web MVC [特殊字符](核心注解 + 進階開發)

前言&#xff1a; 歡迎來到 Spring Web MVC 深入學習 的第二期&#xff01;在第一期中&#xff0c;我們介紹了 Spring Web MVC 的基礎知識&#xff0c;學習了如何 搭建開發環境、配置 Spring MVC、編寫第一個應用&#xff0c;并初步了解了 控制器、視圖解析、請求處理流程 等核…

一文讀懂數據倉庫:從概念到技術落地

數據倉庫是一個面向主題的、集成的、相對穩定的、反映歷史變化的數據集合&#xff0c;用于支持管理決策。以下是關于數據倉庫的詳細介紹&#xff1a; 一、特點 面向主題&#xff1a;數據倉庫圍繞特定主題組織數據&#xff0c;如客戶、產品、銷售等&#xff0c;而不是像傳統數…

JavaScript學習18-css操作和事件處理程序(html/DOM0/DOM2)

一、css操作 第一種&#xff1a;容易出錯 第二種&#xff1a;有效避免錯誤 第三種&#xff1a; 二、事件處理程序 1.HTML事件 2.DOM0級事件處理 3.DOM2級事件處理

npm設置代理和取消代理

設置代理 具體代理端口要根據自己的來 npm config set proxy http://127.0.0.1:7890 npm config set https-proxy http://127.0.0.1:7890取消代理 npm config delete proxy npm config delete https-proxy查看代理 npm config get proxy # 應返回 null npm config get…

從零開始訓練Codebook:基于ViT的圖像重建實踐

完整代碼在文末&#xff0c;可以一鍵運行。 1. 核心原理 Codebook是一種離散表征學習方法&#xff0c;其核心思想是將連續特征空間映射到離散的碼本空間。我們的實現方案包含三個關鍵組件&#xff1a; 1.1 ViT編碼器 class ViTEncoder(nn.Module):def __init__(self, codebo…

大數據筆試題_第一階段配套筆試題02

已知一個字符類型的日期&#xff1a;2022-01-20&#xff0c;請用SQL顯示出此日期對應的下個月的月份&#xff0c;結果要求為Number類型&#xff08;202201&#xff09;。 參考答案 sql SELECT to_date(2022-01-20, yyyy-mm-dd) a1,add_months(to_date(2022-01-20, yyyy-mm-d…

C++實現對象單例模式

在 C 中實現單例模式有多種方法&#xff0c;以下是線程安全的現代 C 實現方式&#xff08;推薦 C11 及以上版本&#xff09;&#xff1a; 1. Meyers’ Singleton&#xff08;推薦&#xff09; class Singleton { public:// 刪除拷貝構造和賦值運算符Singleton(const Singleto…

企業常用Linux服務搭建

1.需要兩臺centos 7服務器&#xff0c;一臺部署DNS服務器&#xff0c;另一臺部署ftp和Samba服務器。 2. 部署DNS 服務器? #!/bin/bash# 更新系統 echo "更新系統..." sudo yum update -y# 安裝 BIND 和相關工具 echo "安裝 BIND 和相關工具..." sudo y…

UE5Actor模塊源碼深度剖析:從核心架構到實踐應用

UE5 Actor模塊源碼深度剖析:從核心架構到實踐應用 a. UE5 Actor模塊架構概述 在UE5引擎中,Actor扮演著至關重要的角色,它是整個游戲世界中各類可交互對象的基礎抽象。從本質上來說,所有能夠被放置到關卡中的對象都屬于Actor的范疇,像攝像機、靜態網格體以及玩家起始位置…

DreamDiffusion代碼學習及復現

論文解讀在這里 File path | Description /pretrains ┣ &#x1f4c2; models ┃ ┗ &#x1f4dc; config.yaml ┃ ┗ &#x1f4dc; v1-5-pruned.ckpt┣ &#x1f4c2; generation ┃ ┗ &#x1f4dc; checkpoint_best.pth ┣ &#x1f4c2; eeg_pretain ┃ ┗ …

用Python實現TCP代理

依舊是Python黑帽子這本書 先附上代碼&#xff0c;我在原書代碼上加了注釋&#xff0c;更好理解 import sys import socket import threading#生成可打印字符映射 HEX_FILTER.join([(len(repr(chr(i)))3) and chr(i) or . for i in range(256)])#接收bytes或string類型的輸入…