利用这个题来了解一下逆序对是神马http://www.51nod.com/Challenge/Problem.html#!#problemId=1019
解决逆序数问题有三种方法,但是第一种暴力求解不赞成使用 所以这里不详细说明
那么第一种:分治法——归并排序求逆序数 时间复杂度为O(nlogn)
归并排序基本思想:将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
算法如下:
#include <stdlib.h>
#include <stdio.h>
int Count;
void Merge(int sourceArr[],int tempArr[], int startIndex, int midIndex, int endIndex)
{
int i = startIndex, j=midIndex+1, k = startIndex;
while(i!=midIndex+1 && j!=endIndex+1)
{
if(sourceArr[i] > sourceArr[j])
{
tempArr[k++] = sourceArr[j++];
Count += midIndex - i + 1;
}
else
tempArr[k++] = sourceArr[i++];
}
while(i != midIndex+1)
tempArr[k++] = sourceArr[i++];
while(j != endIndex+1)
tempArr[k++] = sourceArr[j++];
for(i=startIndex; i<=endIndex; i++)
sourceArr[i] = tempArr[i];
}
//内部使用递归
void MergeSort(int sourceArr[], int tempArr[], int startIndex, int