L'algorithme de tri de la classe conteneur dans Java JDK utilise principalement le tri par insertion et le tri par fusion. L'implémentation peut être différente selon les versions. Le code clé est le suivant :
// fusion
// si les tableaux sont déjà triés - pas de fusion
if (((Comparable<Object>) in[med - 1]).compareTo(in[med]) <= 0) {
System.arraycopy(in, start, out, start, len);
retour;
}
int r = med, je = début ;
// utilise la fusion avec la recherche exponentielle
faire {
Comparable<Object> fromVal = (Comparable<Object>) in[start];
Comparable<Object> rVal = (Comparable<Object>) in[r];
si (fromVal.compareTo(rVal) <= 0) {
int l_1 = find(in, rVal, -1, start + 1, med - 1);
int toCopy = l_1 - début + 1 ;
System.arraycopy(in, start, out, i, toCopy);
i += toCopier ;
out[i++] = rVal;
r++;
début = l_1 + 1 ;
} autre {
int r_1 = find(in, fromVal, 0, r + 1, end - 1);
int toCopie = r_1 - r + 1;
System.arraycopy(in, r, out, i, toCopy);
i += toCopier ;
out[i++] = fromVal;
démarrer++ ;
r = r_1 + 1 ;
}
} while ((end - r) > 0 && (med - start) > 0);
// copie le reste du tableau
si ((fin - r) <= 0) {
System.arraycopy(in, start, out, i, med - start);
} autre {
System.arraycopy(in, r, out, i, end - r);
}
}
Par exemple, {1, 2, 3, 5, 8, 13} est représenté par l'ensemble suivant :
0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
Le pseudo-code est le suivant :
pour (i dans [0~n-1]) bit[i] = 0 ;
pour(je dans [0~n-1])
si (je suis dans le fichier d'entrée)
bit[i] = 1
pour(je dans [0~n-1])
si(bit[i] == 1)
sortie je
Essayez-le avec du code java, l'efficacité est vraiment bonne :
public static void main (final String[] arguments) {
List<Integer> firstNum = new ArrayList<Integer>();
List<Integer> secondNum = new ArrayList<Integer>();
pour (int i = 1; i <= 1000000; i++) {
firstNum.add(i);
secondNum.add(i);
}
Collections.shuffle(firstNum);
Collections.shuffle(secondNum);
getStartTime();
Collections.sort(firstNum);
getEndTime("exécution du tri Java ");
getStartTime();
secondNum = uniqueSort(secondNum);
getEndTime("Exécution uniqueSort ");
}
public static List<Integer> uniqueSort(final List<Integer> uniqueList) {
javaUniqueSort.tempList.clear();
pour (int i = 0; i < javaUniqueSort.temp.length; i++) {
javaUniqueSort.temp[i] = 0;
}
pour (int i = 0; i < uniqueList.size(); i++) {
javaUniqueSort.temp[uniqueList.get(i)] = 1;
}
pour (int i = 0; i < javaUniqueSort.temp.length; i++) {
if (javaUniqueSort.temp[i] == 1) {
javaUniqueSort.tempList.add(i);
}
}
renvoie 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");
}
}
Durée de fonctionnement :
Temps d'exécution du tri Java : 1257737334ns
Durée d'exécution de uniqueSort : 170228290ns
Temps d'exécution du tri Java : 1202749828ns
Durée d'exécution de uniqueSort : 169327770ns
public static void main (final String[] arguments) {
Aléatoire aléatoire = nouveau Aléatoire();
List<Integer> firstNum = new ArrayList<Integer>();
List<Integer> secondNum = new ArrayList<Integer>();
pour (int je = 1; je <= 100000; i++) {
firstNum.add(i);
secondNum.add(i);
firstNum.add(random.nextInt(i + 1));
secondNum.add(random.nextInt(i + 1));
}
Collections.shuffle(firstNum);
Collections.shuffle(secondNum);
getStartTime();
Collections.sort(firstNum);
getEndTime("exécution du tri Java ");
getStartTime();
secondNum = uniqueSort(secondNum);
getEndTime("Exécution uniqueSort ");
}
public static List<Integer> uniqueSort(final List<Integer> uniqueList) {
javaDuplicateSort.tempList.clear();
int[] temp = nouveau int[200002];
pour (int i = 0; i < temp.length; i++) {
temp[i] = 0;
}
pour (int i = 0; i < uniqueList.size(); i++) {
temp[uniqueList.get(i)]++;
}
pour (int i = 0; i < temp.length; i++) {
pour (int j = temp[i]; j > 0; j--) {
javaDuplicateSort.tempList.add(i);
}
}
renvoie javaDuplicateSort.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");
}
}