只是不愿随波逐流 ...|

lidongdongdong~

园龄:2年7个月粉丝:14关注:8

23、MSD 字符串排序算法

内容来自刘宇波老师算法与数据结构体系课

1、图示

image
image
image

2、递归原理

image
image
image

3、实现 MSD

/**
* RadixSort
* Most Significant Digit 字符串排序算法
* String[] arr 中, 每个字符串的长度可以不相等
* 复杂度 O(W * N), W 是最长的字符串长度
*/
public class MSDSort {
private MSDSort() {
}
/**
* O(W * N), W 是最长的字符串长度
*/
public static void sort(String[] arr) {
sort(arr, 0, arr.length - 1, 0, new String[arr.length]);
}
/**
* 根据 radix 位置的字符, 对 arr[left, right] 进行 MSD 基数排序
*/
private static void sort(String[] arr, int left, int right, int r, String[] temp) {
if (left >= right) return;
// 字符范围 [0, 256) + 空
int R = 256;
int[] cnt = new int[R + 1];
int[] index = new int[R + 2];
for (int i = left; i <= right; i++) cnt[r >= arr[i].length() ? 0 : (arr[i].charAt(r) + 1)]++;
for (int i = 0; i < R + 1; i++) index[i + 1] = index[i] + cnt[i];
for (int i = left; i <= right; i++) {
int p = r >= arr[i].length() ? 0 : (arr[i].charAt(r) + 1);
temp[left + index[p]] = arr[i];
index[p] += 1;
}
System.arraycopy(temp, left, arr, left, right - left + 1);
// index[0 ... R + 1] 的最后一个区间无效
// 需要遍历 index[0 ... R] 中所有的区间
for (int i = 0; i + 1 <= R; i++) {
sort(arr, left + index[i], left + index[i + 1] - 1, r + 1, temp);
}
}
}

4、复杂度分析

image

posted @   lidongdongdong~  阅读(54)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开