问题是根据字符串的长度对字符串数组进行排序。根据长度对字符串数组进行排序
例如
input = {"cat", "star", "act", "gid", "arts", "dog", "rats"}
output = {"cat", "act", "gid", "dog", "star", "arts", "rats"}
我做到了使用插入排序(使用字符串而非字符串本身的长度)。我的问题:有没有更好的方法来做到这一点?
我想到的另一种方法是 - 使用TreeMap
将每个字符串及其长度存储为值(假定字符串在给定数组中是唯一的)。然后根据它的值对它进行排序。运行时间为O(nlogn)
,空间复杂度为O(n)
。你认为这是一个更好的方法吗?
编辑:抱歉,不提前提到这一点 - 我想这样做,而不使用Arrays.sort()
或自定义比较。
插入排序代码示例:
public static String[] insertionSort(String[] arr) {
for(int i=1;i<arr.length;i++) {
int j = 0;
for(;j<i;j++) {
if(arr[j].length() > arr[j+1].length()) {
String temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
我认为预期的代码在时间和空间上都是'O(n)',因为不需要排序元素,只是[bucket sort]的初始传递(http://en.wikipedia.org/wiki/Bucket_sort )。 –
@AlexeiLevenkov:我是否使用桶的二维字符串数组执行此操作? – codewarrior
我不确定你的目标/语言是什么:我会将长度映射到具有该长度的字符串列表,并在第一次迭代时填充它,而不是简单地按顺序复制所有列表。如果你知道字符串的长度是有限的,你可以只使用数组或数组,并使用第一个索引作为关键字的长度,否则你需要构建/使用散列表来获得O(1)阵列。 –