裸基数排序(Raw Radix Sort)

裸基数排序(Raw Radix Sort)是一种非比较型排序算法,它通过将数据按位(从最低有效位到最高有效位)进行排序来实现整体排序。它是一种高效的排序算法,特别适用于大量整数或字符串的排序。裸基数排序的时间复杂度通常为 ,其中 是待排序元素的数量, 是数字的最大位数或最大长度。

基本概念

裸基数排序利用数字的位数信息进行排序。算法的关键在于按位排序(从最低有效位到最高有效位),并使用稳定的排序算法(如计数排序)来确保排序的正确性。

算法步骤

  1. 确定最大位数: 找到数据中最大数值的位数或字符串的最大长度,以决定需要多少次按位排序。
  2. 按位排序: 从最低有效位开始,对所有数据进行排序,然后移动到更高的位,直到所有位都排序完毕。
  3. 稳定排序: 每一位排序都需要使用稳定的排序算法,如计数排序,以确保排序结果的正确性。

代码示例(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)。

稳定性

裸基数排序是一种稳定的排序算法。每次按位排序使用的计数排序算法本身就是稳定的,这确保了相等元素在排序后的相对位置不会改变。

总结

裸基数排序是一种高效的非比较型排序算法,特别适用于大量整数或字符串的排序。通过按位排序和使用稳定的排序算法,它能快速处理大量数据。尽管其时间复杂度通常为 ,对于大数据集或需要高效排序的场景,它是一个非常有效的选择。