정렬 알고리즘 (5) - 빠른 정렬
0. 원리
빠른 정렬은 교환 정렬을 구분하는 것으로 분치법을 채택했다.분치법은 원문제를 약간의 규모가 더 작지만 구조와 원문제가 비슷한 자문제로 분해하여 점차적으로 자문제를 구하고 마지막으로 자문제의 해를 조합하는 것이 원문제의 해이다.
위의 설명에서 알 수 있듯이 관건은 바로 이 조작을 구분하는 것이다. 여기서 가장 간단하고 이해하기 쉬운 구분 방법을 사용한다
여기에서도 시뮬레이션을 통해 시퀀스 [2, 8, 1, 5, 3]을 정렬합니다.
partition 0 and 4 start
2 8 1 5 3 (exchange data: 2 1) 1 8 2 5 3
1 8 2 5 3 (exchange data: 2 8) 1 2 8 5 3
partition 0 and 4 finish and partition is 1
partition 2 and 4 start
1 2 8 5 3 (exchange data: 8 3) 1 2 3 5 8
partition 2 and 4 finish and partition is 4
partition 2 and 3 start
partition 2 and 3 finish and partition is 2
1. 실현
private void quickSort(int[] data, int start, int end) {
if (start < end) {
System.out.println("partition " + start + " and " + end + " start");
int partition = partition(data, start, end);
System.out.println("partition " + start + " and " + end + " finish and partition is " + partition);
quickSort(data, start, partition - 1);
quickSort(data, partition + 1, end);
}
}
private int partition(int[] data, int start, int end) {
int pivot = data[start];
while (start < end) {
//
while (start < end && data[end] > pivot) {
end--;
}
if (start < end) {
swap(data, start++, end);
}
//
while (start < end && data[start] < pivot) {
start++;
}
if (start < end) {
swap(data, end--, start);
}
}
data[start] = pivot;
return start;
}
구체적으로 GitHub/QuickSort 보기 가능
2. 복잡도
빠른 정렬은 불안정한 정렬 알고리즘이다.최악의 경우 시간 복잡도는 O(n²),평균 시간 복잡도는 O(nlogn)입니다.분석 시간의 복잡도는 두 부분으로 나뉘는데 하나는partition 함수이다. 이 함수는 왼쪽에서 오른쪽으로 스캐닝하고 오른쪽에서 왼쪽으로 스캐닝한다. 둘이 같고 분명히 O(n) 복잡도의 조작이고 이것은 고정불변한 것이다.두 번째는 외부의 귀속이다. 변화하는 것은 이 기준치를 얻는 것이다. 만약에 이미 질서수열이 있다면 O(n)를 해야 이 귀속을 끝낼 수 있다.따라서 최악의 경우 O(n²),일반적인 상황에서 기준치가 중간의 크기로 되어 있고 서열을 두 개의 크기 편차가 크지 않은 서열로 나눌 수 있다. 이런 시간 복잡도는 바로 O(logn)이다.
따라서 빠른 정렬을 최적화하려면 기준치의 선택이 좋은 최적화 방향이다.
3. 최적화
빠른 정렬의 최적화 방안이 매우 많은데 여기서 구체적인 실현을 하지 않는다. 왜냐하면 모든 방안은 단독으로 한 편으로 쓸 수 있고 간단한 소개만 할 수 있기 때문이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.