2016-08-14 1 views
-2

Wenn ich die Werte in der sortierten Verfahren drucken,welcher Algorithmus Verwendung sortiert Verfahren in Stream-Schnittstelle

Stream.of("d", "a", "b", "e", "c", "f") 
    .sorted((s1, s2) -> { 
     System.out.printf("sort: %s - %s\n", s1, s2); 
     return s1.compareTo(s2); 
    }).forEach(System.out::println); 

Der Ausgang ist wie folgt;

sort: a - d 
sort: b - a 
sort: b - d 
sort: b - a 
sort: e - b 
sort: e - d 
sort: c - d 
sort: c - b 
sort: f - c 
sort: f - e 
a 
b 
c 
d 
e 
f 

Ich konnte die Logik des Sortieralgorithmus hier nicht verstehen. Jede Hilfe wird geschätzt.

+0

Hm interessant, dass es 'b verglichen - zweimal a'. – eckes

Antwort

3

Nachdem es mit OpenJDK 8 den Debugger durchlaufen hatte, war es nicht überraschend, dass es sich um Timsort handelte. Es ist im Grunde eine Merge-Sortierung, die Insertion-Sortierung verwendet, wenn die Unterteilungen der Eingabe klein genug sind (32 oder weniger Elemente mit meiner Version).

Wenn Sie daran interessiert sind, wie es im Detail funktioniert, beziehen sich auf OpenJDK 8 Arrays::sort, zum Beispiel auf grepcode: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/Arrays.java?av=f

+0

Sehr interessanter Algorithmus. Ich werde den Algorithmus jetzt erforschen :) –

Verwandte Themen