Java三种方法实现字符串排序

14 篇文章 10 订阅

Java字符串排序

键索引计数法

int N = a.length;
int R = 256;    //R为字符基数

String[] aux = new String[N];
int[] count = new int[R + 1];

//计算出现频率
for (int i = 0; i < N; i++)
count[a[i].key() + 1]++;

//将频率转换为索引
for (int r = 0; r < R; r++)
count[r + 1] += count[r];

//将元素分类
for (int i = 0; i < N; i++)
aux[count[a[i].key()]++] = a[i];

//回写
for (int i = 0; i < N; i++)
a[i] = aux[i];


命题A：键索引计数法排序N个键为0R-1之间的整数的元素需要访问数组11N+4R+1

低位优先的字符串排序（LSD）

命题B：低位优先的字符串排序算法能够稳定地将定长字符串排序

class LSD{
// Least-Significant-Digit First
//低位优先的字符串排序(基数排序)
public static void sort(String[] a, int W) {
//通过前W个字符将a[]排序
int N = a.length;
int R = 256;    //基数
String[] aux = new String[N];  //辅助数组\

for(int d = W - 1; d >= 0; d--) {
//根据第d个字符用键索引计数法排序
int[] count = new int[R + 1];
//计算出现频率
for (int i = 0; i < N; i++)
count[a[i].charAt(d) + 1]++;
//将频率转换为索引
for (int r = 0; r < R; r++)
count[r + 1] += count[r];
//将元素分类
for (int i = 0; i < N; i++)
aux[count[a[i].charAt(d)]++] = a[i];
//回写
for (int i = 0; i < N; i++)
a[i] = aux[i];
}
}
}


高位优先的字符串排序（MSD）

class MSD{
//高位优先的字符串排序
private static int R = 256;      //基数
private static final int M = 15; //小数组的切换阈值
private static String[] aux;     //数组分类的辅助数组
private static int charAt(String s, int d) {
if(d < s.length()) {
return s.charAt(d);
}else {
return -1;
}
}
public static void sort(String[] a) {
int N = a.length;
aux = new String[N];
sort(a, 0, N - 1, 0);
}
private static void sortInsert(String[] a, int lo, int hi) {
//小型数组进行插入排序
for (int i = lo + 1; i <= hi; i++) {
for(int j = i; j > lo && a[j].compareTo(a[j - 1]) < 0; j--) {
String tmp = a[j];
a[j] = a[j - 1];
a[j - 1] = tmp;
}
}
}
private static void sort(String[] a, int lo, int hi, int d) {
//以第d个字符为键将a[lo]至a[hi]排序
if(hi <= lo + M) {
sortInsert(a, lo, hi);
return;
}
int [] count = new int[R + 2];    //计算频率
for(int i = lo; i <= hi; i++) {
count[charAt(a[i], d) + 2]++;
}
for(int r = 0; r < R + 1; r++) {  //将频率转换为索引
count[r + 1] += count[r];
}
for(int i = lo; i <= hi; i++) {   //数据分类
aux[count[charAt(a[i], d) + 1]++] = a[i];
}
for(int i = lo; i <= hi; i++) {   //回写
a[i] = aux[i - lo];
}
//递归的以每个字符为键进行排序
for(int r = 0; r <R; r++) {
sort(a, lo + count[r], lo + count[r + 1] - 1, d + 1);
}
}
}


三向字符串快速排序

class Quick3string{
//三向字符串快速排序
private static int charAt(String s, int d) {
if(d < s.length()) {
return s.charAt(d);
}
return -1;
}

public static void sort(String[] a) {
sort(a, 0, a.length - 1, 0);
}

private static void sort(String[] a, int lo, int hi, int d) {
if(hi <= lo) {
return;
}
int lt = lo, gt = hi, i = lo + 1;
int v = charAt(a[lo], d);
while(i <= gt) {
int t = charAt(a[i], d);
if(t < v) {
exch(a, lt++, i++);
}else if(t > v) {
exch(a, i, gt--);
}else {
i++;
}
}
//a[lo..lt-1] < v = a[lt..gt] < a[gt+1..hi]
sort(a, lo, lt - 1, d);
if(v >= 0) {
sort(a, lt, gt, d + 1);
}
sort(a, gt + 1, hi, d);
}

private static void exch(String[] a, int i, int j) {
String t = new String(a[i]);
a[i] = a[j];
a[j] = t;
}
}


• 12
点赞
• 56
收藏
觉得还不错? 一键收藏
• 2
评论
03-22 5146
10-28
07-27 7263
01-06 2612
10-30 926
09-23 1995
06-23 406
09-03 4万+

“相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。