찾다

 >  Q&A  >  본문

java.util.Arrays.sort()数组形参传递为啥能修改原始数组的内容?

如题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中文网2770일 전1166

모든 응답(5)나는 대답할 것이다

  • 迷茫

    迷茫2017-04-18 09:08:24

    1. int[] a의 경우 변수 a는 배열 개체의 주소를 힙에 저장하는 것으로 이해할 수 있는 개체 참조입니다(배열의 특정 요소는 힙에 저장됩니다).
    2 .sort() 1에서 언급한 힙에 있는 배열의 주소 값인 변수 a의 참조 값이 전달됩니다. 물론 a의 값을 사용하여 힙에 있는 배열에 액세스한 다음 프로그램은 배열 요소의 값과 순서를 수정할 수 있습니다.

    회신하다
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:08:24

    원래 배열 주소의 복사본이 전달되기 때문에 원래 배열의 값이 변경될 수 있습니다.

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-18 09:08:24

    질문에 답하려면 DualPivotQuicksort() 메서드를 사용하는 소스 코드로 이동하세요.

    으아악

    int[]work 임시 배열은 정렬 프로세스 중에 데이터를 저장하는 데 사용됩니다. 정렬 후에는 원래 배열 int[]a의 내용이 확실히 변경됩니다.
    또한 Arrays.sort() 메서드와 관련하여 다음 지침이 있습니다.

    1. Java 배열에서는 모든 유형의 정렬이 제공됩니다. 주로 8가지 기본 데이터 유형과 객체의 두 가지 범주로 나뉩니다.
    2.Java는 기본(int, float 및 기타 프로토타입 데이터) 배열에 빠른 정렬을 사용하고 객체 배열에 병합 정렬을 사용합니다. 물건을 분류할 때는 안정성이 중요합니다. 예를 들어 성적표는 처음에 학생 번호에 따라 배열되었을 수 있습니다. 이제 성적별로 배열해 보겠습니다. 그러면 원래 성적이 같더라도 Zhang San이 앞에 있었는지 확인해야 합니다. Li Si로 갈 수 없습니다. 4개 뒤로 가세요. 그리고 퀵 정렬은 불안정합니다. 객체 배열에 저장되는 것은 객체의 참조일 뿐이므로 다중 이동으로 인해 추가 오버헤드가 발생하지는 않습니다. 그러나 객체 배열은 일반적으로 비교 횟수에 민감하므로 객체 비교 비용이 훨씬 더 많이 들 수 있습니다. 단순한 숫자의 비교보다 병합 정렬은 이 점에서 빠른 정렬보다 더 나은 작업을 수행하며, 이것이 객체 정렬로 선택하는 중요한 이유 중 하나입니다.
    3. 정렬 최적화: 구현 시 퀵 정렬과 병합이 모두 재귀적, 즉 정렬할 배열의 길이가 7 미만인 경우 대신 버블 정렬을 사용합니다. 재귀적으로. 분석: 길이가 6인 배열의 버블 정렬에 대한 총 비교 수는 최대 1+2+3+4+5+6=21이며 가장 좋은 경우에는 6개의 비교만 있습니다. 퀵 정렬이나 병합은 재귀 호출 등의 오버헤드를 수반하며, n이 작을수록 시간 효율성이 더욱 불리해집니다. 따라서 여기서는 버블 정렬을 사용하는데, 이 역시 퀵 정렬에 있어서 매우 중요한 최적화입니다.
    4. 소스 코드의 퀵 정렬은 정렬할 배열의 요소 수가 적을 때, 소스 코드의 임계값은 7이며 삽입 정렬을 주로 사용합니다. 삽입 정렬의 시간 복잡도는 0(n^2)이지만, 배열 요소가 작은 경우에는 퀵 정렬의 재귀적 연산이 성능에 영향을 미치기 때문에 삽입 정렬이 퀵 정렬보다 낫습니다. 더 나은 선택은 분할 요소(기본 요소)입니다. 어레이를 대략 두 개의 동일한 부분으로 분할할 수 있으면 최악의 시나리오를 피할 수 있습니다. 예를 들어, 배열이 정렬된 경우 첫 번째 요소를 분할 요소로 선택하면 알고리즘의 시간 복잡도가 O(n^2)에 도달하게 됩니다.

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-18 09:08:24

    문자열을 제외하고 Java의 객체는 모두 전달된 참조입니다.

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:08:24

    수정된 것은 참조값인 int[]a, a가 가리키는 값,

    회신하다
    0
  • 취소회신하다