swift演算法之排序 (九)基數排序

2021-09-23 23:45:58 字數 1679 閱讀 6362

1、概述

基數排序屬於分配式排序,又稱 桶子法,他是透過鍵值的部分諮詢,將要排序的元素分配至某些桶中,藉以達到排序的作用。

基數排序是屬於穩定性的排序

2、演算法原理

基本原理:利用桶來實現,然後按照基數入桶,基數的取值是從數字的低位到高位以此取值

步驟:1)以無序序列數值的個數為基數,將無序序列的值進入到基數對應的桶中

2)個位數為基數入桶完畢後,在安裝編號從小到大將桶中的資料以此取出,再存入之前的陣列中

3)在2中生成的陣列的基礎上再以式位數為基準入桶,入桶完畢後,再次按照桶的編號順序將數值取出

注:排序的數值越大,入桶出桶的次數就越多,所以隨著位數的增大,效率會降低

3、舉例

以[62, 88, 58, 47, 62, 35, 73, 51, 99, 37, 93]排序為例

1)取個數為基數,以62為例,取個數為基數,62在本輪進入編號為2的桶中

2)1)排序完,在安裝編號從大到小將桶中的資料取出,存入之前的陣列

3)取十位數為基數入桶,排序完按順序取出,陣列中最高位是十位數,即十位數出桶入桶後,陣列已經排序完成,如果還有高位,需要繼續取基數排序,直到最高位排序完成

4、演算法實現

//1、建立n個空桶

/*返回結果的型別是array>,是乙個二維陣列。

內層陣列就是乙個桶,負責存放與該桶編號相等的基數對應的數值

*/private func createbucket(_ n : int)->array>

}return maxnumber

}//3、獲取數字的長度----即取基數的次數

private func numberlength(_ num : int)->int

//4、獲取數值中特定位數的值

/*通過取餘以及求模的方式獲取 / 採用將數字轉換成字串,然後將字串轉換成字串陣列

*/private class func fetchbasenumber(_ num : int, _ digit : int)->int

return numarr[numarr.count-digit]

}return 0

}//5、排序

func radixsort(_ list : inout array)

//出桶

var index = 0

for i in 0..5、時間複雜度

基數排序的時間複雜度為o(d(n+radix)),其中,一趟分配時間複雜度為o(n),一趟收集時間複雜度為o(radix),共進行d趟分配和收集

github**

注:排序的具體實現**在 sortsummary.swift 檔案裡 呼叫是在 viewcontroller.swift

排序演算法九 基數排序

基數排序 radix sort 又叫桶排序 bucket sort 是一種 分配式排序 而非基於直接比較的排序方式,確切說這是一種匹配方式實現的排序。另外,實現這種排序要求所排序的序列按某乙個基數其排序是偏序方式排列,總體而言基數排序是字典序排序的一種實現形式。它的具體實現即對每一種偏序排序都採取關...

演算法 排序之基數排序

基數排序也是穩定的內排序。因為它的實現是基於內部使用了穩定的排序實現的所以基數排序整體是穩定的,而且時間複雜度為o n 舉個例子 現在我們將一些3 多 位數排序,如果你說直接判斷就好的話,那你就太天真了,因為那就又變成看o nlgn 或者o n 如何能降低時間複雜度變成o n 呢?那就要使用線性時間...

排序演算法之基數排序

首先從多排序碼排序開始介紹基數排序。以撲克牌排序為例。每張撲克牌有兩個 排序碼 花色和面值。其有序關係為 如果把所有撲克牌排成以下次序 2,a,2,a,2,a,2,a 這就是多排序碼排序。排序後形成的有序序列叫做字典有序序列。一般情況下,假定有乙個n個元素的序列 v 0,v1 vn 1 且每個元素v...