裸基数排序(Raw Radix Sort)
裸基数排序(Raw Radix Sort)是一种非比较型排序算法,它通过将数据按位(从最低有效位到最高有效位)进行排序来实现整体排序。它是一种高效的排序算法,特别适用于大量整数或字符串的排序。裸基数排序的时间复杂度通常为 ,其中 是待排序元素的数量, 是数字的最大位数或最大长度。
基本概念
裸基数排序利用数字的位数信息进行排序。算法的关键在于按位排序(从最低有效位到最高有效位),并使用稳定的排序算法(如计数排序)来确保排序的正确性。
算法步骤
- 确定最大位数: 找到数据中最大数值的位数或字符串的最大长度,以决定需要多少次按位排序。
- 按位排序: 从最低有效位开始,对所有数据进行排序,然后移动到更高的位,直到所有位都排序完毕。
- 稳定排序: 每一位排序都需要使用稳定的排序算法,如计数排序,以确保排序结果的正确性。
代码示例(Go语言实现)
以下是裸基数排序的 Go 实现示例:
package main
import (
"fmt"
)
// 计数排序函数,用于按位排序
func countingSort(arr []int, exp int) {
n := len(arr)
output := make([]int, n)
count := make([]int, 10)
// 统计每个桶的计数
for i := 0; i < n; i++ {
index := (arr[i] / exp) % 10
count[index]++
}
// 累加计数
for i := 1; i < 10; i++ {
count[i] += count[i-1]
}
// 从右到左填充输出数组
for i := n - 1; i >= 0; i-- {
index := (arr[i] / exp) % 10
output[count[index]-1] = arr[i]
count[index]--
}
// 将排序后的数组拷贝回原数组
for i := 0; i < n; i++ {
arr[i] = output[i]
}
}
// 裸基数排序函数
func radixSort(arr []int) {
// 找到最大值以确定最大位数
max := arr[0]
for _, num := range arr {
if num > max {
max = num
}
}
// 按位排序
for exp := 1; max/exp > 0; exp *= 10 {
countingSort(arr, exp)
}
}
func main() {
arr := []int{170, 45, 75, 90, 802, 24, 2, 66}
radixSort(arr)
fmt.Println("Sorted array:", arr)
}
复杂度分析
-
时间复杂度:
- 最坏情况:
- 平均情况:
- 最好情况:
-
空间复杂度: ,其中 是待排序元素的数量, 是基数(通常是10)。
稳定性
裸基数排序是一种稳定的排序算法。每次按位排序使用的计数排序算法本身就是稳定的,这确保了相等元素在排序后的相对位置不会改变。
总结
裸基数排序是一种高效的非比较型排序算法,特别适用于大量整数或字符串的排序。通过按位排序和使用稳定的排序算法,它能快速处理大量数据。尽管其时间复杂度通常为 ,对于大数据集或需要高效排序的场景,它是一个非常有效的选择。