基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明可以追溯到1887年赫尔曼·何乐礼在[打孔卡片制表机上的贡献.
实现思路:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。
核心代码:
<pre><code>` func sort(arr:inout [Int]) {
if arr.count == 0 {
return
}
var list:[[Int]] = []
for _ in 0..<10 {
let temp:[Int] = []
list.append(temp)
}
let maxDigit:Int = maxlength(arr: arr)
var tempArr:[Int] = arr
for i in 0..<maxDigit {
for j in 0..<arr.count {
let index:Int = highDigit(num: tempArr[j], index: i)
list[index].append(tempArr[j])
}
saveBucketData(bucketlist: &list, arr: &tempArr)
}
arr = tempArr
}
// 桶的数据插入数组
private func saveBucketData(bucketlist:inout [[Int]],arr:inout [Int]) {
var index:Int = 0
for i in 0..<bucketlist.count {
var bucket:[Int] = bucketlist[i]
if bucket.count > 0 {
for j in 0..<bucket.count {
arr[index] = bucket[j]
index += 1
}
}
bucketlist[i].removeAll() // 注意清空桶数据
}
}
private func highDigit(num:Int,index:Int)->Int {
let base:Double = pow(10, Double(index))
let high:Int = (num / Int(base)) % 10
return high
}
// 最大数字的位数
private func maxlength(arr:[Int])->Int {
var max:Int = 0
for i in 0..<arr.count {
let count:Int = positionOfNum(number: arr[i])
if count > max {
max = count
}
}
return max
}
// 统计数字的位数
private func positionOfNum(number:Int)->Int {
var count:Int = 0
var num:Int = number
while num%10 > 0 {
count += 1
num = num / 10
}
return count
}`</code></pre>
测试代码:
<pre><code>let radixSort:RadixSort = RadixSort() var arr:[Int] = [73, 22, 93, 43, 55, 14, 28, 65, 39, 81, 725] radixSort.sort(arr: &arr) print("FlyElephant---基数排序---\(arr)")
</code></pre>