정렬 [US] 데이터 구조의 최적화 알고리즘을 어떻게 공통를 달성하기 위해, 고성능 선별 기능?

디렉토리

첫째, 어떻게 올바른 정렬 알고리즘을 선택?

1. 목록 정렬 알고리즘

2. 왜 빠른에게 정렬 선택?

둘째, 어떻게 빠른 정렬을 최적화?

셋째, 일반 정렬 기능 구현 기술

넷째, 방과 후 사고


첫째, 어떻게 올바른 정렬 알고리즘을 선택?

1. 목록 정렬 알고리즘

 시간 복잡도는 안정적 종류입니까? 장소는 일종의?
버블 소트 O (N ^ 2) 예
삽입 정렬 O (N ^ 2)가있다
(N ^ 2) 아니오 선택 정렬 O
퀵 O (nlogn) 아니요 
병합 정렬 O (nlogn) 여부
버킷 정렬 O ( N) 인
계산 순서 O (N + k)는, k는 데이터 범위 여부
기수 정렬 O (D 위도 여부는 DN)

2. 왜 빠른에게 정렬 선택?

1) 정렬 낮은 시간 복잡도 선형하지만 쓰기 일반적인 분류 기능 선형 순서를 선택할 수없는 경우, 특별한 시나리오를 사용하여.
2) 정렬 기능을 달성하기 위해 정렬 알고리즘) 계정에 어떤 종류의 데이터, O (nlogn 보통 바람직 시간 복잡도의 크기를 취하기 위해.
3) 빠르고 병합 종류의 O (nlogn) 행과 비교, 병합 정렬 최선의 선택이 빠른 행하므로, 정렬 알고리즘 장소가 아니다.

둘째, 어떻게 빠른 정렬을 최적화?

시간 복잡도 감소 이유로 O (N)에 이르는 빠른 드레인 부당 분할 점 선택하고, 최적의 분할 점은 두 개의 파티션 분할 점의 데이터를 동일한 숫자로 분리된다. 어떻게 파티션 지점을 선택 최적화? 두 가지 널리 사용되는 방법은 다음이있다 :
1. 세 디지털 프랑스 복용
개수와 크기 비교, 분할 점으로 중간 값을 취하도록, 상기 제 1, 중간, 그리고 끝에서 ① 구간.
② 당신이 상대적으로 큰 배열을 정렬 할, 그리고 그 "세 수를 가지고"경우 충분하지 않을 수 있습니다, 당신은 "에 숫자 10을." "숫자 5을"을 원하거나 수
2. 랜덤 : 단면은 분할 지점으로서 각각 임의로 선택된 요소로부터 정렬된다.
다음과 같이 빠른 드레인 경고 재귀 스택 오버 플로우가 발생 3. 두 가지 해결책이 있습니다 :
① 재귀 깊이 제한, 재귀 재귀 정지 임계 값 설정을 초과하면.
② 지금 시스템 스택의 크기에는 제한이 없으며, 함수 호출 스택 아날로그 구현, 아날로그 재귀 수동 푸시 팝 프로세스 힙.

셋째, 일반 정렬 기능 구현 기술

1. 데이터의 양이 공간 시간에 대한 아이디어로 촬영 할 수있는 경우
데이터의 양이, 최적화를 가리킨 빠른 선택 파티션을 행 할 때 2.
3. 방지 스택 오버 플로우가 수동으로 해결 스택 시뮬레이션 호출 스택을 선택할 수 있습니다
4. 정렬 상수는 O 사용을 고려 요소가 특정 수보다 작은 경우에는 간격 (N ^ 2) 삽입 정렬 레벨이
결정되면 제 감시 코드를 단순화는, 각 정렬이 감소하고, 최대한 성능 최적화를 극대화

넷째, 방과 후 사고

어떤 종류의 정렬 알고리즘의 기능에 1.Java 사용하여 구현? 기술은 무엇 있나요?

자바 :
배열 프리미티브 타입 1. 자바 이중 피봇 퀵 (듀얼 피벗 퀵)을 사용하는 알고리즘은 자바 (7)에 도입된다. 이에 앞서, 자바 구현하는 새로운 알고리즘이 java.util.DualPivotQuicksort 클래스에 있는지를 두 번 피벗 일반 퀵, 코드를 최적화 퀵 기존의 빠른 정렬을 사용합니다.
개체 유형 2. 알고리즘은 자바 TimSort, TimSort 알고리즘은 자바 (7)에 도입된다 이용한다. 이에 앞서, 자바는 병합 정렬을 사용합니다. TimSort 최적화 알고리즘은 실제로 병합 정렬, java.util.TimSort 클래스에있는 TimSort 구현 코드의 시리즈입니다.
어레이의 길이가 상대적으로 작은 경우, 정렬 알고리즘 3., 또한보다 효율적인 삽입 정렬을 사용한다.

default void sort(Comparator<? super E> c) {
        Object[] a = this.toArray();
        Arrays.sort(a, (Comparator) c);
        ListIterator<E> i = this.listIterator();
        for (Object e : a) {
            i.next();
            i.set((E) e);
        }
    }

//在Arrays类中,sort()有一系列的重载方法,罗列几个典型的Arrays.sort()方法如下:
public static void sort(int[] a) {
     DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
 }

public static void sort(long[] a) {
     DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
}

public static void sort(Object[] a) {
        if (LegacyMergeSort.userRequested)
            legacyMergeSort(a);
        else
            ComparableTimSort.sort(a, 0, a.length, null, 0, 0);
}

 

게시 된 228 개 원래 기사 · 원 찬양 90 · 전망 810 000 +

추천

출처blog.csdn.net/guochunyang/article/details/104682324