Вопрос заключается в сортировке массива строк, основанных на длине строк.Сортировка массива строк по длине
Например
input = {"cat", "star", "act", "gid", "arts", "dog", "rats"}
output = {"cat", "act", "gid", "dog", "star", "arts", "rats"}
Я сделал это с помощью сортировки вставками (используя длину строк, вместо самих строк). Мой вопрос: есть ли лучший способ сделать это?
Альтернатива, о которой я думал, - использовать TreeMap
для хранения каждой строки и ее длины как значения (предположим, что строки уникальны в данном массиве). Затем сортируйте его на основе его значений. Время работы будет O(nlogn)
, а пространственная сложность - O(n)
. Считаете ли вы, что это лучший подход?
EDIT: Извините, что не упомянул об этом раньше - я хочу сделать это, не используя 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)' как для времени, так и для пространства, так как нет необходимости упорядочивать элементы, только начальный проход [сортировка по ковку] (http://en.wikipedia.org/wiki/Bucket_sort). –
@AlexeiLevenkov: Я делаю это, используя 2-мерный массив строк для ведра? – codewarrior
Я не знаю, какова ваша цель/язык: у меня была бы карта длины в список строк с этой длиной и заполнить ее на первой итерации, чем просто скопировать все списки в порядке. Если вы знаете, что длина строк ограничена, вы можете использовать только массив или массивы и использовать первый индекс в качестве ключа для длины, иначе вам нужно будет построить/использовать хеш-таблицу, чтобы получить O (1), чтобы добавить каждую строку, массив. –