El algoritmo de clasificación de la clase contenedor en Java JDK utiliza principalmente clasificación por inserción y clasificación por fusión. La implementación puede ser diferente en diferentes versiones. El código clave es el siguiente:
// fusionando
// si las matrices ya están ordenadas, no se pueden fusionar
if (((Comparable<Objeto>) en[med - 1]).compareTo(en[med]) <= 0) {
System.arraycopy(entrada, inicio, salida, inicio, len);
devolver;
}
int r = medicina, i = inicio;
// usar fusión con búsqueda exponencial
hacer {
Comparable<Objeto> fromVal = (Comparable<Objeto>) en[inicio];
Comparable<Objeto> rVal = (Comparable<Objeto>) en[r];
si (desdeVal.compareTo(rVal) <= 0) {
int l_1 = buscar(in, rVal, -1, inicio + 1, med - 1);
int toCopy = l_1 - inicio + 1;
System.arraycopy(entrada, inicio, salida, i, toCopy);
i += copiar;
salida[i++] = rVal;
r++;
inicio = l_1 + 1;
} demás {
int r_1 = buscar(en, desdeVal, 0, r + 1, final - 1);
int toCopiar = r_1 - r + 1;
System.arraycopy(entrada, r, salida, i, toCopy);
i += copiar;
fuera[i++] = fromVal;
inicio++;
r = r_1 + 1;
}
} mientras ((fin - r) > 0 && (med - inicio) > 0);
// copia el resto de la matriz
si ((fin - r) <= 0) {
System.arraycopy(entrada, inicio, salida, i, med - inicio);
} demás {
System.arraycopy(entrada, r, salida, i, final - r);
}
}
Por ejemplo, {1, 2, 3, 5, 8, 13} está representado por el siguiente conjunto:
0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
El pseudocódigo es el siguiente:
para (i en [0~n-1]) bit[i] = 0;
para(yo en [0~n-1])
si (yo en el archivo de entrada)
bit[yo] = 1
para(yo en [0~n-1])
si(bit[i] == 1)
salida yo
Pruébelo con código Java, la eficiencia es realmente buena:
público estático vacío principal (cadena final [] argumentos) {
Lista<Integer> firstNum = new ArrayList<Integer>();
Lista<Integer> secondNum = new ArrayList<Integer>();
para (int i = 1; i <= 1000000; i++) {
primerNum.add(i);
segundoNum.add(i);
}
Colecciones.shuffle(firstNum);
Colecciones.shuffle(segundoNum);
getHoraInicio();
Colecciones.sort(firstNum);
getEndTime("tiempo de ejecución de clasificación Java ");
getHoraInicio();
segundoNum = UniqueSort(segundoNum);
getEndTime("tiempo de ejecución de clasificación única ");
}
Lista estática pública <Integer> clasificación única (Lista final <Integer> Lista única) {
javaUniqueSort.tempList.clear();
para (int i = 0; i < javaUniqueSort.temp.length; i++) {
javaUniqueSort.temp[i] = 0;
}
para (int i = 0; i < listaúnica.tamaño(); i++) {
javaUniqueSort.temp[uniqueList.get(i)] = 1;
}
para (int i = 0; i < javaUniqueSort.temp.length; i++) {
si (javaUniqueSort.temp[i] == 1) {
javaUniqueSort.tempList.add(i);
}
}
devolver javaUniqueSort.tempList;
}
público estático vacío getStartTime() {
javaShuffle.start = System.nanoTime();
}
getEndTime vacío estático público (cadena final s) {
javaShuffle.end = System.nanoTime();
System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
}
}
Tiempo de ejecución:
Tiempo de ejecución de clasificación de Java: 1257737334ns
tiempo de ejecución de clasificación única: 170228290ns
Tiempo de ejecución de clasificación de Java: 1202749828ns
tiempo de ejecución de clasificación única: 169327770ns
público estático vacío principal (cadena final [] argumentos) {
Aleatorio aleatorio = nuevo Aleatorio();
Lista<Integer> firstNum = new ArrayList<Integer>();
Lista<Integer> secondNum = new ArrayList<Integer>();
para (int i = 1; i <= 100000; i++) {
primerNum.add(i);
segundoNum.add(i);
firstNum.add(random.nextInt(i + 1));
segundoNum.add(random.nextInt(i + 1));
}
Colecciones.shuffle(firstNum);
Colecciones.shuffle(segundoNum);
getHoraInicio();
Colecciones.sort(firstNum);
getEndTime("tiempo de ejecución de clasificación Java ");
getHoraInicio();
segundoNum = UniqueSort(segundoNum);
getEndTime("tiempo de ejecución de clasificación única ");
}
Lista estática pública <Integer> clasificación única (Lista final <Integer> Lista única) {
javaDuplicateSort.tempList.clear();
int[] temp = nuevo int[200002];
for (int i = 0; i < temp.length; i++) {
temperatura[i] = 0;
}
para (int i = 0; i < listaúnica.tamaño(); i++) {
temp[uniqueList.get(i)]++;
}
for (int i = 0; i < temp.length; i++) {
para (int j = temp[i]; j > 0; j--) {
javaDuplicateSort.tempList.add(i);
}
}
devolver javaDuplicateSort.tempList;
}
público estático vacío getStartTime() {
javaShuffle.start = System.nanoTime();
}
getEndTime vacío estático público (cadena final s) {
javaShuffle.end = System.nanoTime();
System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
}
}