Эккель Брюс
Шрифт:
}
} /* Output: перед сортировкой:
[[i = 58. j = 55]. [i = 93. j = 61]. [i = 61. j = 29] . [i = 68. j = 0]. [i = 22. j = 7]. [i = 88. j = 28] . [i = 51. j = 89]. [i = 9. j = 78]. [i = 98. j = 61]
. [i = 20. j = 58]. [i = 16. j = 40]. [i = 11. j = 22] ]
после сортировки:
[[1 = 68. j = 0]. [i = 22. j = 7]. [i - 11. j - 22]
. [i = 88. j = 28]. [i = 61. j = 29]. [i = 16. j = 40]
. [i = 58. j = 55]. [i = 20. j = 58]. [i = 93. j = 61]
. [i = 98. j = 61]. [i = 9. j = 78]. [i = 51. j = 89] ]
Сортировка массива
Встроенные средства сортировки позволяют отсортировать любой массив примитивов, любой массив объектов, реализующих Comparable или ассоциированных с объектом Comparator1. Следующий пример генерирует случайные объекты String и сортирует их:
//: arrays/StringSorting.java // Sorting an array of Strings, import java.util *; import net.mindview.util.*, import static net.mindview.util.Print *; public class StringSorting {
public static void main(String[] args) {
String[] sa = Generated.array(new String[20],
new RandomGenerator String(5)), print("Before sort. " + Arrays toString(sa)); Arrays sort(sa);
print("After sort. " + Arrays toString(sa)), Arrays.sort(sa, Collections reverseOrder); print("Reverse sort. " + Arrays toString(sa)); Arrays sort(sa, String CASE_INSENSITIVE_ORDER). print("Case-insensitive sort- " + Arrays toString(sa));
}
} /* Output-
Before sort [YNzbr. nyGcF, OWZnT, cQrGs, eGZMm, JMRoE, suEcU, OneOE, dLsmw, HLGEa,
hKcxr, EqUCB. bklna, Mesbt, WHkjU. rUkZP, gwsqP, zDyCy, RFJQA, HxxHv]
After sort- [EqUCB, HLGEa. HxxHv. JMRoE. Mesbt, OWZnT, OneOE, RFJQA, WHkjU, YNzbr,
bklna, cQrGs, dLsmw, eGZMm, gwsqP, hKcxr, nyGcF, rUkZP. suEcU. zDyCy]
Reverse sort: [zDyCy. suEcU, rUkZP, nyGcF. hKcxr, gwsqP, eGZMm, dLsmw. cQrGs, bklna.
YNzbr. WHkjU, RFJQA, OneOE, OWZnT, Mesbt. JMRoE. HxxHv, HLGEa, EqUCB]
Case-insensitive sort, [bklna. cQrGs. dLsmw, eGZMm, EqUCB, gwsqP, hKcxr, HLGEa, HxxHv,
JMRoE. Mesbt. nyGcF, OneOE. OWZnT. RFJQA. rUkZP. suEcU. WHkjU. YNzbr. zDyCy] *///.-
В выходных данных алгоритма сортировки String бросается в глаза то, что алгоритм является лексикографическим, то есть все слова, начинающиеся с прописных букв, предшествуют любым словам, начинающимся со строчных букв. Если вы хотите, чтобы слова группировались независимо от регистра символов, используйте режим String.CASE_INSENSITIVE_ORDER, как показано в последнем вызове sort из приведенного примера.
Алгоритм сортировки, используемый стандартной библиотекой Java, спроектирован в расчете на оптимальность для сортируемого типа — быстрая сортировка для примитивов, надежная сортировка слиянием для объектов. Обычно вам не приходится беспокоиться о быстродействии, если только профайлер не укажет, что процесс сортировки тормозит работу программы.
Поиск в отсортированном массиве
После того, как массив будет отсортирован, вы сможете быстро найти нужный элемент методом Arrays.binarySearchQ. Попытка вызова binarySearchQ для несортированного массива приведет к непредсказуемым последствиям. В следующем примере генератор RandomGenerator.Integer заполняет массив, после чего тот же генератор используется для получения искомых значений:
//. arrays/ArraySearching java
// Using Arrays binarySearch
import java util *;
import net.mindview util *;
import static net mindview.util Print *.
public class ArraySearching {
public static void main(String[] args) { Generator<Integer> gen =
new RandomGenerator.Integer(1000). int[] a = ConvertTo primitive(
Generated.array(new Integer[25], gen)). Arrays sort(a).
ргШСОтсортированный массив: " + Arrays toString(a)). while(true) {
int r = gen.nextO.
int location = Arrays binarySearch(a, r). if(location >= 0) {
pnnt("Значение " + r + " находится в позиции " +
location +
a[" + location + "] = " + a[location]); break. // Выход из цикла while
}
} /* Output
Отсортированный массив- [128. 140. 200. 207. 258. 258. 278. 288, 322. 429. 511. 520.
522. 551. 555. 589. 693. 704. 809. 861. 861. 868. 916. 961. 998]
Значение 322 находится в позиции 8. а[8] = 322