개인 정적 필적 ( INT의 P, INT의 R, INT의 K) { 경우 (p는 == R) { 반환 이 [P]을; } int로 I = randomizedaparttition (P, R); INT의 J = 1-P + 1; // A [P : 전]中元素的个数 경우 (K <= J) { 반환 randomizeSelect (P, I, K)를; } 다른 { 반환 randomizeSelect을 (I + 1, R, K- J); } }
이 그룹의 두 개의 요소가 각 그룹의 평균 미만이기 때문에 식별 기준 적어도 X / 소자 (10), 3 (N-5)보다 크고, 평균은 2 * N / 5- . 1] = (N-5) / 10 , 즉 작은 다른 (N-5) / 10 × 기준의 하나의 N / 5 자리.
마찬가지로, 기준은 적어도 X / 3 미만 (N-5) (10 개) 요소이다. n≥75 경우, 3 (N-5) / / 4 10≥n 그래서 두 개의 서브 클릭 인한 기준 어레이의 길이는 적어도 1/4보다 짧은으로 분할되어있다.
이 사실은 쉽게 이해할 수있다 :
N 요소 CCP 다섯 개 요소의 집합의 배열에 대한 m = N / 5 그룹으로 나누어 총. 각 그룹의 중간 크기의 수를 호출 할 수 있습니다 "중간 시간을."
그런 다음, 전체 어레이 (X)의 "중간"인 중간 값 m = N / 5 번째 "서브 중간"을 제거
명백하게, "중간 시간"의 절반이 X보다 작은 경우 [(N-5) / 10 < m / 2 ]
이 그룹에서, 각각의 요소가 있어야 적어도 3 (S '중간 회 숫자 "의 카운트), X보다 작은
전체 배열은 적어도 있어야하므로 3- (N-5) / 10 요소 X. 미만인
경우 3 (N-5) / 10≥n n≥75 / 4, 즉보다 X. 요소 중 적어도 분기 작은 말하자면
이와 유사하게, 적어도 요소의 분기 큰 X. 이상
이는 전체가보다 균등하게 분할 최장 어레이의 분할 원래의 3/4를 초과하지 후 중간 선택이 합리적임을 보장한다.
당신이 10 학년 클래스, 각 클래스에 다섯 사람이 있다고 가정하자.
특정 시험은, 당신이 3 위 (중간 시간)에 클래스를 테스트합니다.
각 클래스에서 3 위는 10 개인 (중간)에서 다섯 번째로 함께 넣어.
즉, 일년 내내 당신보다 적어도 15 개인 점수가 낮은있다, 말하는 것이 아니다?
개인 정적 는 Comparable SELECT ( INT의 P, INT의 R & LT, INT K) { IF (RP는 <5. ) { 거품 정렬 (P, R & LT); // 상기 배열을 정렬하는 간단한 알고리즘 [P를, R] 정렬 복귀 A [P를 . 1-K +은 ] } // I]는 [P로 + 5 * I + * A [P + 5 것 4] 와 제 작은 소자 A [P + I]를 교환 사이트 // 중앙값을 찾을 중앙값, RP-4, 즉 상기 언급 된 5-N-. 대 ( INT I = 0; I는 <= (4-RP)를 / 5;.. 난 ++ ) { INT S. 5 * = P + I; INT T = S + . (4) , 대 ( INT J <3;. J ++ J = 0 ) { 버블 (S, t - J); } MyMath.swap (a, P + I, S + 2 ); } 필적의 X = 선택 (P, P의 + (RP-4) / (5) (RP + 6) / 10 ); INT I = 파티션 (P, R, X); INT의 J = 1-P + 1 ; 경우 (K <= J) { 반환 (P, I, K)을 선택; } 다른 { 반환 선택은 (i + 1, R, K- J)를; } }