题目描述:请对一组字符串进行排序,字符串由大写字母和数字组成,需要满足以下的比较规则
1.长度相同时,长度较短的排在前面。
2.长度相同时,按照字典顺序排列(AaBb - Zz, 0-9顺序),即大写字母在小写字母前,数字排在字母后。
要求时间复杂度为O(nlogn)。
比如:
abc Abc 123 1 1bc CBD abcd a
排序后的结果:
a 1 Abc abc CBD 1bc 123 abcd
解题思路:应用快排。
package lianxi;
public class StringSort {
// 比较两个字符串的大小
public static int cmp(String left, String right) {
if (left.length() != right.length()) {
return left.length() - right.length();
}
int len = left.length();
for (int i = 0; i < len; i++) {
char l = left.charAt(i);
char r = right.charAt(i);
if (l == r) {
continue;
}
int lcv = getCharValue(l);
int rcv = getCharValue(r);
if (lcv != rcv)
return lcv - rcv;
}
return 0;
}
public static int getCharValue(char c) {
if (c >= 'a') {
return (c - 'a') * 2 + 1;
} else if (c >= 'A') {
return (c - 'A') * 2;
}
return c - '0' + 52;
}
public static int getMiddle(String[] data, int low, int hight) {
String temp = data[low];
while (low < hight) {
while (cmp(temp, data[hight]) <= 0 && low < hight)
hight--;
data[low] = data[hight];
while (cmp(data[low], temp) <= 0 && low < hight)
low++;
data[hight] = data[low];
}
data[low] = temp;
return low;
}
public static void quick_sort(String[] data, int left, int right) {
if (left < right) {
int middle = getMiddle(data, left, right);
quick_sort(data, left, middle - 1);
quick_sort(data, middle + 1, right);
}
}
public static void sort(String[] input) {
quick_sort(input, 0, input.length - 1);
}
public static void main(String[] args) {
String[] input = { "abc", "Abc", "123", "1", "1bc", "CBD", "abcd", "a" };
sort(input);
for (String item : input)
System.out.println(item);
}
}