C ++ 역수 (홀수 짝수 배치 및 정렬 판)

역 번호 설명

한 구성에서, 즉 후자 앞의 수보다 큰 수의 크기의 역순에 숫자의 한쌍의 종 방향 위치는, 그들이 역순이라는 경우. 역순으로 호출 된 번호의 총 수에 대한 역 배열. 모든 총 역 배열은 역순으로이 번호라고합니다. 즉, 어느 한 다음, 다른 요소, 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;
}

하나님 영원히 당신을 축복!

게시 33 개 원래 기사 · 원 찬양 47 ·은 10000 +를 볼

추천

출처blog.csdn.net/SkeletonKing233/article/details/99622727