Voici une implémentation de tri rapide dans Scala. En comparant le temps d'exécution de quickSortRecursive à java.util.Arrays.sort(), j'ai trouvé java.util.Arrays.sort plus rapide d'un ordre de grandeur sur les grands tableaux. Quelqu'un peut-il faire allusion à la raison de cette différence de performance?Tri rapide dans Scala vs java.util.Arrays.sort
def quickSortRecursive(list: Array[Int])(low: Int=0, high: Int=list.length-1): Unit = {
if (low<high) {
swap(list,Random.nextInt(high),high)
val pivot = partition(list, low, high)
quickSortRecursive(list)(low, pivot-1)
quickSortRecursive(list)(pivot+1, high)
}
}
private def partition(list: Array[Int], low: Int, high: Int): Int = {
val pivot = list(high)
var lowhigh = low
for (i <- low until high) {
if (list(i) < pivot) {
swap(list, lowhigh, i);
lowhigh += 1;
}
}
swap(list, lowhigh, high);
lowhigh
}
private def swap(list: Array[Int], i: Int, j: Int): Unit = {
val tmp = list(i)
list(i) = list(j)
list(j) = tmp
}
Parce que Java [Arrays.sort] (http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort%28java.lang.Object []% 29) utilise une version de [Timsort] (http://svn.python.org/projects/python/trunk/Objects/listsort.txt)? –
Je voudrais réitérer votre question pour qu'il soit évident qu'il s'agit d'une question «Java vs Scala». En outre, triez votre tri Scala fait à la main par rapport au tri de la bibliothèque standard Java pour les tableaux de taille environ 100 à une taille suffisamment grande pour voir une tendance évidente, et publiez-la ici aussi. – Rainbolt
Random.nextInt() est assez cher. Je commencerais par l'enlever. L'implémentation des boucles 'for' dans scala est relativement complexe et pas aussi optimale. –