23、MSD 字符串排序算法
1、图示
2、递归原理
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、复杂度分析
本文来自博客园,作者:lidongdongdong~,转载请注明原文链接:https://www.cnblogs.com/lidong422339/p/17321299.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步