알고리즘 작성된 질문 (32) 및 배열의 배열 요소를 변환 역순위한 알고리즘을 통합하여 나머지 다른 원소의 제품 ...

주제 : 사람들이 이전과 이후 높은 큐에 낮은 순으로 배열되어있는 경우 오류가 다른 작업의이면보다 앞의 사람,
  예 : 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 재현

추천

출처blog.csdn.net/weixin_33912246/article/details/94232126