주제 : 사람들이 이전과 이후 높은 큐에 낮은 순으로 배열되어있는 경우 오류가 다른 작업의이면보다 앞의 사람,
예 : 176,178,180,170,171] 에러에
<176170> <176171> <178170> <178171> <180170> <180171>.
이제 정수 시퀀스에서 이러한 모든 오류를 식별하도록 요청;
분석 :
- 역순 (반전 쌍) : N의 수는 정렬 시간 복잡도는, 리버스 시퀀스 번호를 요청 크기의 역순 수 [0, N (N-1) / 2]을 결정하고 통합 할 수있다 O (NlogN)는, 공간 복잡도는 O (N);
- 파일이 이미 아이 정렬되어 있기 때문에, 될 수있는 역방향 관련된 큰 파일을 획득하기위한 선별 후 아이 파일, 사용 m은 = / 2 처리부 디지털 재귀 시퀀스는 상기 제 계산 아이 파일 리버스 정렬 (나는 J를 +) 비교 동작의 많은 피;
문제 해결 :
. (1) INT 파티션 ( INT의 * 배열, int로 I, INT J) { 2 / * * 3. * 추가 공간 O (N) 저장된 마지막 정렬 순서를 이용하여 4. * * / 5. INT의 m = / (I가 J를 +) 2 ; . 6 INT TArrayNoInit이 [J-I + 1이다. ]; INT의 인덱스 = 0 ; . 7 INT 티 = I, TJ = m의 + . (1) ] .도 8 의 INT COUNT = 0 ; . 9 10 의 printf ( " \ N- % D %의 D %의 D % D ", I, J, 어레이 [I] 배열 [J]) . 11 그동안 TI (<= m && TJ <= J)가 { 12 인 경우 (배열 [티] " 어레이 [TJ가]) { 13 인 / * * 14 * 오른쪽 시퀀스 요소 만이 남아 시퀀스 미만되는 참고 15 소자, 카운트 값이 증가하지 않는다 * 및 항 16 종류의 특성 * 역순 합계 유도 될 수있다 (17). * * / 18 인 COUNT + = m-TI + 1이다. ; . 19 TArrayNoInit이 [지수 = 배열 [TJ] 20 인 ++ TJ ; 21이다 } 다른{ (22)은 = TArrayNoInit이 [인덱스] , 어레이 [티] 23 인 ++ 티 ; 24 } 25 인덱스 ++ ; 26이다 } 27 / * * 28 * 참고 프로세스 이미 정렬 때문에 좌우 시퀀스의 나머지 요소가 언제 29 TArrayNoInit이 직접 복사 될 수 * 에서 30 * * / 31 인 경우 (티> m) { 32 그동안 (TJ <= J)가 { 33은 TArrayNoInit이 [지수 = , 어레이 [TJ] 34 인 ++ TJ와 인덱스 ++는 ; 35 } 36 37 } 다른 경우 (TJ> J) { 38 동안 TI (<= m) { 39 TArrayNoInit이 [지수 = 배열 [TI]; 40 TI ++; 인덱스 ++ ; 41 } 42 } 43 44 대 ( INT에 K = 1은, k는 <= J; ++ 케이 ) 45 어레이 [K] = TArrayNoInit이 [K]; 46 47 복귀 카운트; 48 } 49 50 INT의 병합 (INT * 배열, int로 난 의 INT J) { 51 인 / * * (52)은 하나의 요소가 0으로 반환 할 때 시간 * 53는 다른 직접적인 비교 재귀 호출 사용할 때와 J가 인접한 경우 * 54이다 * * / 55 의 printf ( " \ n을-D ** % D % " , I, J) (56) 인 경우 (J == I)가 복귀 0 ] (57) 인 경우 (I는 + . 1 == J) { 58 IF (배열 [I] " 어레이 [J] ) { 59 INT의 T = 배열 [I] 60 어레이 [I] = 배열 [J] 61는 어레이 [J] = T; 62은 창 1이다. ] (63)이다 } 다른 64 반환 0 , 65 } 66 67 / * * 68 이진 재귀를 사용하여 *는, 카운트 값이 세 부분에 의해 결정된다 : (69) * 역순 각 내부 서열 주위 및 서열 및 왼쪽 70 * 표시 오른쪽 하위 서열과 반대. 71 * 이후, 정렬 된 서열의 주위 병합 이후 72 * 파티션 (N) 시간 복잡도 O에서 수행 될 수 있지만, (73) 추가로 O (N) 공간 * 필요한 복잡성 74 * * / 75 의 INT m = / (I는 J에게 +) 2 ; 76 INT의 카운트 = 0 ; 77 카운트 + = 병합 (배열, I, m); 78 카운트 + = 병합 (배열, m + 1 , J); 79 카운트 + = 파티션 (배열, I, J); 80 81 복귀 카운트; 82 } 83 84 INT 의 main () { 85 INT의 배열 [] = { 7 , 2 , 1 , 4 , 3 , 5 , 6 }; 86 의 printf ( " \ n 개의 %의 D "병합 (배열, 0 , 6 )); 87 88 복귀 0 ; 89 }
주제 : 어레이의 길이 N A [0], A [1 ], ..., A [N-1]. 이제 어레이 이름 요소를 업데이트 즉, a는 [0]이 [1]이 [N-1]의 제품이, a는 [1]이된다에 해지는 [0] 및 [2] [N-1 상기 생성물, ..., A [N-1 ] 이 [0] [N-2 제품은 (즉, 현재의 구성 요소를 제거하고, 제품의 다른 모든 요소 일)에,
. 1)
. 2)
분석 : A [I]를 떠나기 전에 요소 제품의 관점에서 [I]를 I를 저장하기위한 두 개의 좌측 배열 [N], 우 [N]을 만들고 바로 소자 후의 생성물은 [I] 난 기억 때문에 좌우 초기화 어레이의 두 검사를 필요로하는 시간 복잡도가 선형이며, 분할을 사용하지;
문제 해결 :
1 공극 전송 ( INT의 * 어레이 INT의 길이) { 2 INT leftarray [길이]; 3 INT rightarray [길이]; 4 5 leftarray는 [ 0 ] = 1 ; 도 6 에 대해 ( int로 I = 1 ; i가 길이 <; 내가 ++ ) 7 leftarray [I] = leftarray [I- 1 ] * 배열 [I- 1 ]; 8 9 rightarray [길이 - 1 ] = 1 ; 10 대 ( INT전 길이 - = 2 ; I> - 1 , 난 - ) 11 rightarray [I] = rightarray [I + 1 ] * 배열 [I + 1 ]; 12 (13) 에 대해 ( int로 I = 0 ; I <길이; 내가 ++ ) 14 어레이 [I] = leftarray [I] * rightarray [I]; 15 } 16 17 INT 의 main () { 18 INT의 배열 [] = { 5 , 2 , 3 , 4 }; 19 INT의 길이 = 4 ; (20) 전송 (배열, 길이); (21) 에 대한이 ( 값 int = 1을 0 ; i가 길이 <; 나는 ++ ) 22 의 printf ( " %의 D, " 배열 [I]); 23 반환 0 ; 24 }
HTTPS : //www.cnblogs.com/leo-chen-2014/p/3749298.html 재현