【发布时间】:2013-11-05 08:36:35
【问题描述】:
问题是根据字符串的长度对字符串数组进行排序。
例如
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。 -
@AlexeiLevenkov:我是否使用存储桶的二维字符串数组来执行此操作?
-
我不确定您的目标/语言是什么:我将长度映射到具有该长度的字符串列表并在第一次迭代时填写它,而不是简单地将所有列表按顺序复制在一起.如果您知道字符串的长度是有限的,您可以只使用一个或多个数组并使用第一个索引作为长度的键,否则您需要构建/使用哈希表来获得 O(1) 来添加每个字符串以纠正子-数组。
-
@AlexeiLevenkov:假设我对字符串的最大/最小长度一无所知。假设我的语言是 Java,您的方法似乎是我在问题中给出的替代方法,对吧?
-
是的,它有些不同,但我的运行时估计是错误的 - 如果不知道最大长度,你仍然需要对结果数组进行排序......所以你的红黑树方法是和我的
HashMap建议一样好。
标签: arrays string algorithm sorting