역 번호 설명
한 구성에서, 즉 후자 앞의 수보다 큰 수의 크기의 역순에 숫자의 한쌍의 종 방향 위치는, 그들이 역순이라는 경우. 역순으로 호출 된 번호의 총 수에 대한 역 배열. 모든 총 역 배열은 역순으로이 번호라고합니다. 즉, 어느 한 다음, 다른 요소, N, 원소 (여기서, 소정의 많은 표준 오름차순) 사이에 제 1 소정 표준 서열이 존재하는 경우 두 개의 소자로 배치 된 n 개의 요소 중 하나이다 순서와 순서가 동일한 표준 아니라, 그는 역순가 말했다. 모든 총 역 배열은 역순으로이 번호라고합니다.
숫자는 역 배치가 홀수 초점 또는 장치를 배치하는 것으로 판정된다. 수가 홀수 반대의 순서 인 경우, 이러한 구성도 다르게 배치 홀수 배열이다.
예를 들어, 따라서 이중 구성으로 배열, 역방향의 수가 6이고, 상기 (1), (3) (2) 앞의 (4), (3)의 앞에 53,124 서열 1 앞의 5 3 전면 -5,5- 전륜 2, 5 참조.
역 수를 계산
직접 시뮬레이션 경우, 시간 복잡도는 ^ 2에,하지만 코드를 더 간단하지만 최적화 시간에 원하는 경우에, 당신은 일종의 병합을 사용해야합니다.
참고 : 당신이 병합 정렬을 공부하지 않은 경우, 당신은 알아 보려면이 페이지를 방문 할 수 있습니다
https://blog.csdn.net/SkeletonKing233/article/details/100676151을
역순의 수의 계산은 우리는 두 개의 하위 시퀀스가에 축적 합병.
예를 들어, 원하는 경우 이들 두 시퀀스 통일
1,4,6,7,9
2,3,5,10,13,21
번째 열거 된 요소 (4)의 제 1 시퀀스, 두 번째 두 서열 SO 4> 2, 처음 두 소자 중 제 1 서브 - 시퀀스의 경우 정렬되므로 첫 번째 요소 2:00 열거 순서> 2~4는 순서가, 우리는 축적해야하며 2보다 반드시 더 큰 개시 후 4 자리이므로하게 플러스 역방향의 값 (중간 - I + 1) 오행의 요소 수의 두 번째 요소에서 두. 이 레벨의 온은 log2 (n)에 대한 시간 복잡도를 감소시킨다.
(PS : NR은 상기 어레이의 요소들의 수의 상한)
# include <cstdio>
# include <iostream>
# include <cmath>
# include <cstring>
# include <algorithm>
using namespace std;
# define FOR(i, a, b) for(int i = a; i <= b; i++)
# define _FOR(i, a, b) for(int i = a; i >= b; i--)
const int NR = 100000;
int n, cnt;
int a[NR + 10];
void MergeArray(int left, int mid, int right){
int ans[NR + 10], len = 0;
int t1 = left, t2 = mid + 1;
while(t1 <= mid && t2 <= right){
if(a[t1] < a[t2]) ans[++len] = a[t1++];
else{
ans[++len] = a[t2++];
cnt += mid - t1 + 1;
}
}
while(t1 <= mid) ans[++len] = a[t1++];
while(t2 <= right) ans[++len] = a[t2++];
FOR(i, left, right) a[i] = ans[i - left + 1];
}
void MergeSort(int left, int right){
if(left >= right) return;
int mid = (left + right) / 2;
MergeSort(left, mid);
MergeSort(mid + 1, right);
MergeArray(left, mid, right);
}
int main()
{
scanf("%d", &n);
FOR(i, 1, n) scanf("%d", &a[i]);
MergeSort(1, n);
printf("此排列逆序数为%d\n", cnt);
if(cnt % 2 == 1) puts("此排列为奇排列");
else puts("此排列为偶排列");
return 0;
}
하나님 영원히 당신을 축복!