2014-05-06 2 views
1

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 
} 
+2

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)? –

+2

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

+1

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. –

Répondre

2

Vous comapared une implémentation hautement optimisé d'un algorithme de tri générique (java.util.Arrays.sort) à une mise en œuvre sans optimisation Roulotté main (votre code Scala).

Ainsi, il est lié à être plus lent.

Quel résultat visez-vous? Pour une bonne comparaison, vous pouvez essayer de comparer les différents algorithmes de tri fournis par la bibliothèque standard Scala avec ceux fournis par la distribution standard Java. Ou vous pouvez implémenter votre Quicksort en Java et Scala et comparer les résultats.

+1

Je suis d'accord que OP compare pommes avec poires, et était sur le point de suggérer également de comparer le même quicksort manuscrit en Java. –