逆番号説明
一の構成では、大きさの逆の順序で番号の一対の長手方向位置、後者の前に数より即ち数より大きい場合は、それらは逆の順序と呼ばれます。逆の順序で着信番号の総数に逆の配置。全ての合計は逆の配置が逆の順序でこの番号と呼ばれています。すなわち、いずれか、次いで、異なる要素に対してN、要素(ここでは、多くの所定の基準昇順)との間の第一の所定の標準配列が存在する二要素ときに配置されるn個の要素の一つであります順序と順序が同じで、標準ではない、彼は逆の順序があると述べました。全ての合計は逆の配置が逆の順序でこの番号と呼ばれています。
番号が逆の配置が奇数に焦点を当てる、あるいは配列を配置することが決定されます。数が奇数の逆順である場合、このような構成であってもそうでなければ配置奇数の配列です。
例えば、4の前方に前2、5、1の前に53124配列、5 3フロント5を参照して、3 1の正面に、3 2上に、逆の数は、従って、デュアル構成で配置、6でした。
逆数計算
直接シミュレーションは、その後、時間の複雑さは、On ^ 2である場合は、コードよりシンプルですが、あなたが最適化時間にしたい場合は、マージソートを使用する必要があります。
注:あなたはマージソートを研究していない場合は、こちらのページをご覧でき
https://blog.csdn.net/SkeletonKing233/article/details/100676151
我々は二つのサブシーケンスがそれに蓄積合併し、逆の順序の数を計算します。
例えば、我々は彼らに2つのサブ統一したい場合は
1,4,6,7,9
2,3,5,10,13,21の
ときに、第2の列挙要素4、第2の最初のシーケンス2つの配列がSO 4>図2に示すように、最初の2つの要素から第一のサブシーケンス場合順序付けられているので、最初の要素2:00列挙配列、> 2〜4が故障しているが、我々が蓄積する必要がある、そして2より必ずしも大きい開始後の全ての4桁は、そうしましょうプラス逆の値(MID - I + 1)、5つの要素内の要素の数に対する第2の要素の両方から。これは、レベルの上* 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;
}
神は永遠にあなたを祝福します!