Алгоритм сортировки класса контейнера в Java JDK в основном использует сортировку вставкой и сортировку слиянием. В разных версиях реализация может отличаться. Код ключа следующий:
// слияние
// если массивы уже отсортированы - слияния нет
if (((Comparable<Object>) in[med - 1]).compareTo(in[med]) <= 0) {
System.arraycopy(вход, запуск, выход, запуск, длина);
возвращаться;
}
int r = med, я = начало;
// используем слияние с экспоненциальным поиском
делать {
Comparable<Object> fromVal = (Comparable<Object>) in[start];
Comparable<Object> rVal = (Comparable<Object>) in[r];
если (fromVal.compareTo(rVal) <= 0) {
int l_1 = find(in, rVal, -1, start + 1, med - 1);
int toCopy = l_1 — старт + 1;
System.arraycopy(in, start, out, i, toCopy);
я += Копировать;
выход [я++] = рВал;
р++;
начало = l_1 + 1;
} еще {
int r_1 = find(in, fromVal, 0, r + 1, end - 1);
int toCopy = r_1 - r + 1;
System.arraycopy(in, r, out, i, toCopy);
я += Копировать;
выход [я++] = fromVal;
начать++;
г = г_1 + 1;
}
} while ((end - r) > 0 && (med - start) > 0);
// копируем остальную часть массива
если ((конец - r) <= 0) {
System.arraycopy(in, start, out, i, med - старт);
} еще {
System.arraycopy(in, r, out, i, end - r);
}
}
Например, {1, 2, 3, 5, 8, 13} представлено следующим набором:
0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
Псевдокод выглядит следующим образом:
для (i в [0~n-1]) бит[i] = 0;
for(i в [0~n-1])
если (я во входном файле)
бит[я] = 1
for(i в [0~n-1])
если (бит [я] == 1)
выход я
Попробуйте это с помощью Java-кода, эффективность действительно хорошая:
public static void main(final String[] args) {
List<Integer> firstNum = новый ArrayList<Integer>();
List<Integer> SecondNum = новый ArrayList<Integer>();
for (int i = 1; я <= 1000000; я++) {
firstNum.add(я);
SecondNum.add(я);
}
Collections.shuffle(firstNum);
Collections.shuffle(второйNum);
ПолучитьНачалоВремя();
Collections.sort(firstNum);
getEndTime("Время выполнения сортировки Java");
ПолучитьНачалоВремя();
SecondNum = uniqueSort (второйNum);
getEndTime("Время выполнения uniqueSort");
}
public static List<Integer> uniqueSort(final List<Integer> uniqueList) {
javaUniqueSort.tempList.clear();
for (int i = 0; i < javaUniqueSort.temp.length; i++) {
javaUniqueSort.temp[i] = 0;
}
for (int i = 0; i < uniqueList.size(); i++) {
javaUniqueSort.temp[uniqueList.get(i)] = 1;
}
for (int i = 0; i < javaUniqueSort.temp.length; i++) {
если (javaUniqueSort.temp[i] == 1) {
javaUniqueSort.tempList.add(я);
}
}
вернуть javaUniqueSort.tempList;
}
public static void getStartTime() {
javaShuffle.start = System.nanoTime();
}
public static void getEndTime(final String s) {
javaShuffle.end = System.nanoTime();
System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
}
}
Время работы:
Время выполнения Java-сортировки: 1257737334 нс
уникальное время выполнения сортировки: 170228290нс
Время выполнения Java-сортировки: 1202749828ns
Уникальное время выполнения сортировки: 169327770 нс
public static void main(final String[] args) {
Случайный случайный = новый случайный();
List<Integer> firstNum = новый ArrayList<Integer>();
List<Integer> SecondNum = новый ArrayList<Integer>();
for (int я = 1; я <= 100000; я++) {
firstNum.add(я);
SecondNum.add(я);
firstNum.add(random.nextInt(i + 1));
SecondNum.add(random.nextInt(i + 1));
}
Collections.shuffle(firstNum);
Collections.shuffle(второйNum);
ПолучитьНачалоВремя();
Collections.sort(firstNum);
getEndTime("Время выполнения сортировки Java");
ПолучитьНачалоВремя();
SecondNum = uniqueSort (второйNum);
getEndTime("Время выполнения uniqueSort");
}
public static List<Integer> uniqueSort(final List<Integer> uniqueList) {
javaDuplateSort.tempList.clear();
int[] temp = новый int[200002];
for (int i = 0; i < temp.length; i++) {
темп [я] = 0;
}
for (int i = 0; i < uniqueList.size(); i++) {
temp[uniqueList.get(i)]++;
}
for (int i = 0; i < temp.length; i++) {
for (int j = temp[i]; j > 0; j--) {
javaDuplateSort.tempList.add(i);
}
}
вернуть javaDuplateSort.tempList;
}
public static void getStartTime() {
javaShuffle.start = System.nanoTime();
}
public static void getEndTime(final String s) {
javaShuffle.end = System.nanoTime();
System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
}
}