java.util.Arrays.sort()数组形参传递为啥能修改原始数组的内容?
PHP中文网
PHP中文网 2017-04-18 09:06:24
0
5
1190

如题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

PHP中文网
PHP中文网

认证0级讲师

répondre à tous(5)
迷茫

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() :

static void sort(int[] a, int left, int right, int[] work, int workBase, int workLen)

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,

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal