교육 학적 차원
단순성 때문에 Lomuto의 파티셔닝 방법은 구현하기가 더 쉬울 수 있습니다. 정렬에 관한 Jon Bentley의 Programming Pearl 에는 멋진 일화가 있습니다 .
“Quicksort에 대한 대부분의 논의는 두 개의 다가오는 지수 [...] [즉 Hoare 's]에 기반한 파티셔닝 체계를 사용합니다. 그 체계의 기본 아이디어는 간단하지만 항상 세부 사항을 까다롭게 발견했습니다. 나는 짧은 파티션 루프에 숨어있는 버그를 추적하는 데 이틀 동안 더 나은 부분을 보냈습니다. 예비 초안을 읽은 독자는 표준 2- 인덱스 방법이 실제로 Lomuto의 방법보다 간단하다고 주장하고 그의 요점을 밝히기 위해 몇 가지 코드를 스케치했습니다. 두 가지 버그를 발견 한 후 조사를 중단했습니다.”
성과 차원
실제 사용을 위해, 효율성을 위해 구현의 용이성이 희생 될 수있다. 이론적으로 우리는 성능을 비교하기 위해 요소 비교 및 스왑 수를 결정할 수 있습니다. 또한 실제 실행 시간은 캐싱 성능 및 지점 오해와 같은 다른 요소의 영향을받습니다.
아래에 표시된 것처럼 알고리즘 은 스왑 수를 제외하고 임의 순열에서 매우 유사하게 작동합니다 . Lomuto는 Hoare의 3 배가 필요합니다 !
비교 횟수
n−1n
스왑 수
스왑 수는 배열의 요소에 따라 두 알고리즘 모두에서 임의입니다. 임의의 순열 을 가정하면 , 즉 모든 요소가 고유하고 요소의 모든 순열이 동일하게 발생할 경우 예상 스왑 수를 분석 할 수 있습니다 .
1,…,n
로무 토의 방법
jA[j]x1,…,nx−1xx−1x
{1,…,n}1n
1n∑x=1n(x−1)=n2−12.
n
호 아레의 방법
x
ijxij
x
Hyp(n−1,n−x,x−1)n−xx−1(n−x)(x−1)/(n−1)x
마지막으로 Hoare 분할에 대한 전체 예상 스왑 수를 얻기 위해 모든 피벗 값에 대해 평균을 다시 계산합니다.
1n∑x=1n(n−x)(x−1)n−1=n6−13.
(자세한 설명은 29 페이지 내 석사 논문 에서 확인할 수 있습니다 .)
메모리 액세스 패턴
두 알고리즘 모두 배열에 순차적으로 스캔하는 두 개의 포인터를 사용합니다 . 따라서 둘 다 거의 최적의 wrt 캐싱을 수행합니다.
동일한 요소와 이미 정렬 된 목록
Wandering Logic에서 이미 언급했듯이 임의 순열이 아닌 목록의 경우 알고리즘의 성능이 크게 다릅니다.
n/2
0ijO(nlogn)
0A[j] <= x
i=nΘ(n2)
결론
Lomuto의 방법은 간단하고 구현하기 쉽지만 라이브러리 정렬 방법을 구현하는 데 사용해서는 안됩니다.
A[i+1] <= x
. 정렬 된 배열에서 (합리적으로 선택된 피벗이 주어지면) Hoare는 스왑을 거의하지 않으며 Lomuto는 톤을 수행합니다 (j는 충분히 작아지면 모든A[j] <= x
.) 무엇을 놓치고 있습니까?