如题java.util.Arrays.sort(int[] a)
数组形参传递为啥能修改原始数组的内容?
[public static void sort(int[] a)](http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort(int[]))
Sorts the specified array into ascending numerical order.
Implementation note: The sorting algorithm is a Dual-Pivot Quicksort by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm offers O(n log(n)) performance on many data sets that cause other quicksorts to degrade to quadratic performance, and is typically faster than traditional (one-pivot) Quicksort implementations.
Parameters:a - the array to be sorted
1. Pour int[] a, la variable a est une référence d'objet, qui peut être comprise comme enregistrant l'adresse de l'objet tableau dans le tas (les éléments spécifiques du tableau sont stockés dans le tas
2) ; . sort() La valeur de référence de la variable a est transmise, qui est la valeur d'adresse du tableau dans le tas mentionné en 1. En utilisant la valeur de a, bien sûr, vous pouvez accéder au tableau dans le tas, puis au Le programme peut modifier la valeur et l'ordre des éléments du tableau.
Étant donné qu'une copie de l'adresse du tableau d'origine est transmise, la valeur du tableau d'origine peut être modifiée.
Pour répondre à votre question, allez dans le code source. Il utilise une méthode de DualPivotQuicksort.sort() :
Le tableau temporaire int[]work est utilisé pour stocker les données pendant le processus de tri. Après le tri, le contenu du tableau int[]a d'origine sera définitivement modifié.
De plus, concernant la méthode Arrays.sort(), il y a les instructions suivantes :
1. Le tri de tous les types est fourni dans les tableaux Java. Il est principalement divisé en deux catégories : 8 types de données de base et Objet.
2.Java utilise le tri rapide pour les tableaux primitifs (int, float et autres données prototypes) et le tri par fusion pour les tableaux d'objets. Lorsqu'il s'agit de trier des objets, la stabilité est importante. Par exemple, le relevé de notes a peut-être été organisé en fonction du numéro d'élève au début. Maintenant, organisons-le par notes. Ensuite, vous devez vous assurer que Zhang San était à l'origine devant Li Si. Même si leurs notes sont les mêmes, Zhang San. Je ne peux pas aller vers Li Si. Allez derrière les quatre. Et le tri rapide est instable. Ce qui est stocké dans le tableau d'objets est uniquement la référence de l'objet, donc plusieurs décalages n'entraîneront pas de surcharge supplémentaire. Cependant, le tableau d'objets est généralement sensible au nombre de comparaisons. Il est possible que la comparaison d'objets soit beaucoup plus coûteuse. que la comparaison de simples nombres. Le tri par fusion fait un meilleur travail que le tri rapide à cet égard, ce qui est l'une des raisons importantes de le choisir comme tri d'objet.
3. Optimisation du tri : dans l'implémentation, le tri rapide et la fusion sont récursifs, c'est-à-dire que lorsque la longueur du tableau à trier est inférieure à 7, le tri à bulles est utilisé directement à la place. de manière récursive. Analyse : Le nombre total de comparaisons pour le tri des bulles d'un tableau d'une longueur de 6 est au maximum de 1+2+3+4+5+6=21, et dans le meilleur des cas, il n'y a que 6 comparaisons. Le tri ou la fusion rapide implique la surcharge des appels récursifs, etc., et son efficacité temporelle devient plus désavantageuse lorsque n est petit. Par conséquent, le tri à bulles est utilisé ici, ce qui est également une optimisation très importante pour le tri rapide.
4. Le tri rapide dans le code source optimise principalement les aspects suivants. Lorsque le nombre d'éléments dans le tableau à trier est faible, le seuil dans le code source est de 7 et le tri par insertion est utilisé. Bien que la complexité temporelle du tri par insertion soit de 0(n^2), lorsque les éléments du tableau sont petits, le tri par insertion est meilleur que le tri rapide, car l'opération récursive du tri rapide affecte les performances. Un meilleur choix est l’élément diviseur (élément de base). La possibilité de diviser le tableau en deux parties égales évite les pires scénarios. Par exemple, lorsque le tableau est ordonné, la sélection du premier élément comme élément de division fera que la complexité temporelle de l'algorithme atteindra O (n ^ 2).
À l'exception de String, les objets en Java sont tous des références transmises.
Ce qui est modifié, c'est la valeur de référence, qui est int[] a, la valeur pointée par a,