O algoritmo de classificação da classe contêiner em Java JDK usa principalmente classificação por inserção e classificação por mesclagem. A implementação pode ser diferente em diferentes versões.
// mesclando
// se os arrays já estiverem ordenados - sem mesclagem
if (((Comparable<Object>) in[med - 1]).compareTo(in[med]) <= 0) {
System.arraycopy(entrada, início, saída, início, len);
retornar;
}
int r = med, i = início;
// usa mesclagem com pesquisa exponencial
fazer {
Comparable<Object> fromVal = (Comparable<Object>) in[start];
Comparable<Object> rVal = (Comparable<Object>) in[r];
if (fromVal.compareTo(rVal) <= 0) {
int l_1 = encontrar(in, rVal, -1, início + 1, med - 1);
int toCopy = l_1 - início + 1;
System.arraycopy(in, start, out, i, toCopy);
i += paraCopiar;
saída[i++] = rVal;
r++;
início = l_1 + 1;
} outro {
int r_1 = encontrar(in, fromVal, 0, r + 1, fim - 1);
int paraCopiar = r_1 - r + 1;
System.arraycopy(in, r, out, i, toCopy);
i += paraCopiar;
fora[i++] = deVal;
iniciar++;
r = r_1 + 1;
}
} while ((end - r) > 0 && (med - start) > 0);
//copia o resto do array
if ((fim - r) <= 0) {
System.arraycopy(in, start, out, i, med - start);
} outro {
System.arraycopy(in, r, out, i, end - r);
}
}
Por exemplo, {1, 2, 3, 5, 8, 13} é representado pelo seguinte conjunto:
0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
O pseudocódigo é o seguinte:
para (i em [0~n-1]) bit[i] = 0;
para (eu em [0 ~ n-1])
if (i no arquivo de entrada)
bit[i] = 1
para (eu em [0 ~ n-1])
se(bit[i] == 1)
saída eu
Experimente com código java, a eficiência é muito boa:
public static void main(final String[] args) {
List<Integer> primeiroNum = new ArrayList<Integer>();
List<Integer> segundoNum = new ArrayList<Integer>();
for (int i = 1; i <= 1000000; i++) {
primeiroNum.add(i);
segundoNum.add(i);
}
Coleções.shuffle(primeiroNum);
Coleções.shuffle(segundoNum);
getStartTime();
Coleções.sort(primeiroNum);
getEndTime("tempo de execução de classificação java");
getStartTime();
segundoNum = uniqueSort(segundoNum);
getEndTime("tempo de execução do 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++) {
if (javaUniqueSort.temp[i] == 1) {
javaUniqueSort.tempList.add(i);
}
}
retornar javaUniqueSort.tempList;
}
public static void getStartTime() {
javaShuffle.start = System.nanoTime();
}
public static void getEndTime(string final s) {
javaShuffle.end = System.nanoTime();
System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
}
}
Tempo de execução:
tempo de execução da classificação java: 1257737334ns
tempo de execução de classificação única: 170228290ns
tempo de execução da classificação java: 1202749828ns
Tempo de execução de classificação única: 169327770ns
public static void main(final String[] args) {
Aleatório aleatório = new Aleatório();
List<Integer> primeiroNum = new ArrayList<Integer>();
List<Integer> segundoNum = new ArrayList<Integer>();
for (int i = 1; i <= 100000; i++) {
primeiroNum.add(i);
segundoNum.add(i);
primeiroNum.add(random.nextInt(i + 1));
segundoNum.add(random.nextInt(i + 1));
}
Coleções.shuffle(primeiroNum);
Coleções.shuffle(segundoNum);
getStartTime();
Coleções.sort(primeiroNum);
getEndTime("tempo de execução de classificação java");
getStartTime();
segundoNum = uniqueSort(segundoNum);
getEndTime("tempo de execução do UniqueSort");
}
public static List<Integer> uniqueSort(final List<Integer> uniqueList) {
javaDuplicateSort.tempList.clear();
int[] temp = new int[200002];
for (int i = 0; i < temp.comprimento; i++) {
temperatura[i] = 0;
}
for (int i = 0; i < uniqueList.size(); i++) {
temp[ListaExclusiva.get(i)]++;
}
for (int i = 0; i < temp.comprimento; i++) {
for (int j = temp[i]; j > 0; j--) {
javaDuplicateSort.tempList.add(i);
}
}
retornar javaDuplicateSort.tempList;
}
public static void getStartTime() {
javaShuffle.start = System.nanoTime();
}
public static void getEndTime(string final s) {
javaShuffle.end = System.nanoTime();
System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
}
}