【排序算法】基數排序

一:基本概念

在這里插入圖片描述

1.1 基數排序(桶排序)介紹

  1. 基數排序(radix sort)屬于“分配式排序”(distribution sort),又稱“桶子法”(bucket sort)或bin sort,顧名思義,它是通過鍵值的各個位的值,將要排序的元素分配至某些“桶”中,達到排序的作用

  2. 基數排序法是屬于穩定性的排序,基數排序法的是效率高的穩定性排序法

  3. 基數排序(Radix Sort)是桶排序的擴展

  4. 基數排序是1887年赫爾曼·何樂禮發明的。它是這樣實現的:將整數按位數切割成不同的數字,然后按每個位數分別比較。

1.2 實現原理

將所有待比較數值統一為同樣的數位長度,數位較短的數前面補零。然后,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以后, 數列就變成一個有序序列。

1.3 將{53, 3, 542, 748, 14, 214} 使用基數排序, 進行升序排序

1.3.1 第1輪排序

數組的初始狀態 arr = {53, 3, 542, 748, 14, 214}

(1) 將每個元素的個位數取出,然后看這個數應該放在哪個對應的桶(一個一維數組)
(2) 按照這個桶的順序(一維數組的下標依次取出數據,放入原來數組)
在這里插入圖片描述

1.3.2 第2輪排序

數組的第1輪排序 arr = {542, 53, 3, 14, 214, 748}

(1) 將每個元素的十位數取出,然后看這個數應該放在哪個對應的桶(一個一維數組)
(2) 按照這個桶的順序(一維數組的下標依次取出數據,放入原來數組)
在這里插入圖片描述

1.3.3 第3輪排序

數組的第2輪排序 arr = {3, 14, 214, 542, 748, 53}

(1) 將每個元素百位數取出,然后看這個數應該放在哪個對應的桶(一個一維數組)
(2) 按照這個桶的順序(一維數組的下標依次取出數據,放入原來數組)
在這里插入圖片描述

數組的第3輪排序 arr = {3, 14, 53, 214, 542, 748}

1.4 原理圖

在這里插入圖片描述

二:復雜度

2.1 時間復雜度

在這里插入圖片描述

2.2 空間復雜度

LSD算法中,由于逐次清理 array 中數據,外層每一循環會開辟大小為 10 的桶,那么空間復雜度為:O ( k ),或者記為:O ( n + k )

三:代碼實現

3.1 基數排序代碼

/*** 基數排序*/
public class RadixSort {public static void main(String[] args) {//原始數組long start = System.currentTimeMillis();int[] array = new int[8000000];for (int i = 0; i < array.length; i++) {//Math.random() * 80000生成0到100的隨機數array[i] = (int) (Math.random() * 80000);}//System.out.println("排序前:" + Arrays.toString(array));radixSort(array);long end = System.currentTimeMillis();System.out.println("執行時間為:" + (end - start));}/*** 基數排序方法* <p>* 說明:* 1.二維數組包含了十個一維數組* 2.為了防止數據在插入數組時,數據溢出,則每個桶的大小定義為array.length* 3.基數排序就是空間換時間的最典型的算法** @param array 需要排序的數組*/public static void radixSort(int[] array) {//先得到數組中最大數的位數//首先假定第一位數就是最大數int max = array[0];for (int i = 1; i < array.length; i++) {if (array[i] > max) {max = array[i];}}//得到最大數是幾位數int maxLength = (max + "").length();//定義二維數組,表示十個桶,每個桶就是一個一維數組int[][] bucket = new int[10][array.length];//為了記錄每個桶中實際存放了多少個數據(每次存放的時候,數據是不一樣的),我們定義一個一維數組記錄每次存放的數據個數// [0]記錄的就是bucket[0]這個桶,每次放入數據的個數int[] bucketElementCounts = new int[10];//最大位數有maxLength,所以遍歷maxLength次for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {//第i輪排序:針對每個元素的位數進行排序,第一次是個位數,第二次是十位數,以此類推for (int j = 0; j < array.length; j++) {//取出每個元素的個位數的數值int digitOfElement = array[j] / n % 10;//放入到對應的桶中bucket[digitOfElement][bucketElementCounts[digitOfElement]] = array[j];//每添加一次,需要加一,保證每添加一次數據就會更新數量bucketElementCounts[digitOfElement]++;}//按照這個數組的順序(一維數組的下標依次取數據,放入原來的數組)int index = 0;//遍歷每一個桶,并且將同種的數據放入到原數組當中for (int k = 0; k < bucketElementCounts.length; k++) {//如果桶中有數據,我們才放入到原數組中if (bucketElementCounts[k] != 0) {//循環該桶,即第k個桶,也就是第k個一維數組for (int l = 0; l < bucketElementCounts[k]; l++) {//取出元素導入到arr中array[index] = bucket[k][l];index++;}}//第i+1輪處理后需要將每個bucketElementCounts[k]置為0bucketElementCounts[k] = 0;}//第一輪排序結束//System.out.println("第" + (i + 1) + "輪:對個位排序處理array=" + Arrays.toString(array));}//System.out.println("排序后:" + Arrays.toString(array));}
}

3.2 八百萬條數據的執行時間

在這里插入圖片描述
執行時間為:442毫秒

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

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

相關文章

【圖說】電腦發展史

免責聲明:文中有一些圖片來源自網絡,如有版權請通知我刪除,謝謝! “結繩記事”是計算的開端 如果說“結繩記事”僅是計數,那么“算籌”就是真正的計算工具 算盤也是我們老祖宗的杰出發明,最擅長“加減乘除”,包括但不限于乘方、開方、對數等。還能進行開發智力的“珠心算…

鼠標失靈怎么辦?電腦出現鼠標失靈的詳細處理方法介紹

無論是筆記本電腦還是臺式機電腦&#xff0c;鼠標是必不可少的外設之一&#xff0c;而我們在使用電腦的過程中&#xff0c;經常回遇到鼠標突然失靈了&#xff0c;不聽使喚&#xff0c;控制不了&#xff0c;接下小編來與大家一起分享&#xff0c;遇到這種情況我們該怎么辦 有時…

C語言學習筆記(二)

C語言學習 學習筆記(一) 學習筆記(二&#xff09; 文章目錄 C語言學習一、C語言中的數據類型進制二進制八進制十六進制進制轉換表 單位換算尋址 數據類型基本類型整數類型整數的有符號和無符號實數類型字符型 構造類型指針類型空類型總結 常量直接常量符號常量轉義符 符號常量…

Python并發編程:多線程-GIL全局解釋器鎖

一 引子 在Cpython解釋器中&#xff0c;同一個進程下開啟的多線程&#xff0c;同一時刻只能有一個線程執行&#xff0c;無法利用多核優勢首先&#xff1a;需要明確的一點是GIL并不是Python的特性&#xff0c;它是在實現Python解析器(CPython)時所引入的一個概念。就好比c是一套…

協議(網絡協議)

HTTP/HTTPS 協議 HTTP 實際上是個縮寫&#xff0c;英文全稱是&#xff1a;Hyper Text Transfer Protocol &#xff08;超文本傳輸協議&#xff09;。 最常用的網頁&#xff08;也叫web頁&#xff09;就是一種超文本的具體表現形式。HTTPS &#xff08;全稱&#xff1a;Hyper …

美團-放水果

題目&#xff1a; 放水果 把M個相同的水果放在N個同樣的盤子里&#xff0c;允許有的盤子空著不放&#xff0c;問不同的放法數K是多少&#xff1f;請注意&#xff0c;5&#xff0c;1&#xff0c;1和1&#xff0c;5&#xff0c;1 是同一種放法。輸入描述 第一行是測試數據的數目…

【Spring】19 @Autowired注解使用詳解

文章目錄 構造函數注入Setter方法注入字段注入數組和集合注入特殊情況處理特殊接口類型的注入異常處理結語 Spring 框架的 Autowired 注解是實現依賴注入的一種強大而靈活的方式。在本文中&#xff0c;我們將介紹 Autowired 注解的多種用法&#xff0c;包括構造函數、setter方法…

ICASSP2024 | ICMC-ASR 車載多通道語音識別挑戰賽總結

為促進駕駛場景中語音處理和識別研究&#xff0c;在ISCSLP 2022上成功舉辦智能駕駛座艙語音識別挑戰 (ICSRC)的基礎上&#xff0c;西工大音頻語音與語言處理研究組 (ASLPNPU)聯合理想汽車、希爾貝殼、WeNet社區、字節、微軟、天津大學、南洋理工大學以及中國信息通信研究院等多…

EMO在哪體驗?阿里對口型視頻生成工具EMO下載地址?阿里巴巴新模型EMO的技術原理

這幾天&#xff0c;阿里的對口型視頻生成工具EMO火了。根據官方宣傳&#xff0c;EMO只需要上傳一張圖片和一段音頻就可以一鍵生成對口型視頻&#xff0c;而且視頻中的嘴型還可以與聲音匹配。這項技術支持多語言、對話、唱歌以及快速語速的適配&#xff0c;但也可能成為制造虛假…

pip降級在pycharm中

PyCharm依賴于"–build-dir"參數安裝第三方庫&#xff0c;但該參數在最新的23.0版pip中已刪除 解決辦法就是降級pip&#xff0c;PyCharm中選擇File&#xff0c;找到編譯器&#xff0c;點擊pip&#xff0c;勾選對應版本即可 或者在cmd中執行運行python -m pip install…

基于centos的linux上docker安裝,及mysql、redis等應用在docker容器中的安裝

Docker環境安裝 安裝yum-utils&#xff1a; yum install ‐y yum‐utils device‐mapper‐persistent‐data lvm2為yum源添加docker倉庫位置&#xff1a; yum‐config‐manager ‐‐add‐repo https://download.docker.com/linux/centos/docker‐ce.repo如果上面執行命令后…

【matlab】matlab隨機函數-rand

matlab中rand相關的隨機函數包括rand(),randn(),randi()等。相關用法如下&#xff1a; 1&#xff0c;rand(m,n) 含義&#xff1a;生成0-1間均勻分布的隨機矩陣(m行&#xff0c;n列)&#xff0c;如果mn&#xff0c;則可簡寫為rand(m) >> rand(1) ans 0.8147 ----------…

Linux系統中的高級多線程編程技術

在Linux系統中&#xff0c;多線程編程是一種常見的并發編程模型&#xff0c;通過利用多線程可以實現程序的并發執行&#xff0c;提高系統的性能和響應速度。在Linux系統中&#xff0c;開發人員通常使用 pthread 庫來進行多線程編程&#xff0c;同時需要掌握線程同步技術以避免并…

JVM(4)

垃圾回收問題 垃圾回收算法 通過之前的學習我們可以將死亡對象標記出來了,標記出來后我們就可以進行垃圾回收操作了,在正式學習垃圾處理器之前,我們先來看一下垃圾回收器使用的幾種算法. 標記-清除算法 "標記-清除"算法是基礎的收集算法.算法分為"標記"…

「Vue3系列」Vue3指令

文章目錄 一、Vue3 指令二、注冊-自定義指令三、常見自定義指令1. 聚焦指令&#xff08;v-focus&#xff09;2. 高亮指令&#xff08;v-highlight&#xff09;3. 防抖指令&#xff08;v-debounce&#xff09;4. 限制輸入指令&#xff08;v-limit&#xff09;使用注意事項 四、相…

WPF中如何設置自定義控件

1.圓角按鈕的設置&#xff1a; 眾所周知在WPF中自帶有提示信息&#xff0c;當我問創建Button時&#xff0c;點擊空格出現如下可選設置 帶有小扳手&#x1f527;圖標為相應的屬性&#xff0c;如果Button有CornerRadius&#xff08;角半徑&#xff09;屬性就能夠直接設置Button實…

33. 【Linux教程】Linux 用戶組

前面小節介紹了 Linux 用戶相關的增刪改查&#xff0c;本小節介紹 Linux 用戶組&#xff0c;Linux 系統中采取了一種安全機制&#xff08;即用戶組&#xff09;&#xff0c;用戶組可以允許多個 Linux 用戶共享同一種權限。 1. 用戶組介紹 Linux 是多任務多用戶的操作系統&…

鴻蒙Harmony應用開發—ArkTS聲明式開發(自定義事件分發)

ArkUI在處理觸屏事件時&#xff0c;會在觸屏事件觸發前進行按壓點和組件區域的觸摸測試&#xff0c;來收集需要響應觸屏事件的組件&#xff0c;再基于觸摸測試結果分發相應的觸屏事件。在父節點&#xff0c;開發者可以通過onChildTouchTest決定如何讓子節點去做觸摸測試&#x…

【AI Agent系列】【MetaGPT多智能體學習】5. 多智能體案例拆解 - 基于MetaGPT的智能體辯論(附完整代碼)

本系列文章跟隨《MetaGPT多智能體課程》&#xff08;https://github.com/datawhalechina/hugging-multi-agent&#xff09;&#xff0c;深入理解并實踐多智能體系統的開發。 本文為該課程的第四章&#xff08;多智能體開發&#xff09;的第三篇筆記。主要是對課程剛開始環境搭…

Linux系統——Shell腳本——一鍵安裝LNMP

#!/bin/bash #安裝nginx echo "安裝nginx服務" wget http://nginx.org/download/nginx-1.11.4.tar.gz &>/dev/null if [ $? -eq 0 ] thenecho "nginx-1.11.4安裝包下載完成"echo "--開始安裝必要的依賴文件--"yum install -y gcc gcc-c…