标签:



#ifndef INVERT_DATA_COUNT_H#define INVERT_DATA_COUNT_H#include<iostream>int invertPairCore(int *arr,int *copy,int start,int end);int invertDataPairCount(int *arr,int Length);int invertDataPairCount(int *arr,int Length){if(arr==NULL||Length==0){return 0;}int *copy=new int[Length];/*for(int i=0;i<Length; i++){copy[i]=arr[i];}*/int InverpairCountSum=invertPairCore(arr,copy,0,Length-1);delete[] copy;return InverpairCountSum;}int invertPairCore(int *arr,int *copy,int start,int end){if(start==end){copy[start]=arr[start];return 0;}int mid=(end-start)/2; //相当于归并排序,先排好序,分成两组int leftInvertPair=invertPairCore(arr,copy,start,start+mid);int rightInvertPair=invertPairCore(arr,copy,start+mid+1,end);int i=start+mid;int j=end;int indexCopy=end;int pairCount=0;//核心步骤,和图解差不多的意思。while(i>=start&&j>=start+mid+1){if(arr[i]>arr[j]){copy[indexCopy--]=arr[i--];pairCount+=j-(start+mid+1)+1;}else{copy[indexCopy--]=arr[j--];}}- //对剩下的数的处理,也就是在两数组比较的时候还有剩下数据拷贝到copy数组中。
for(;i>=start; --i){copy[indexCopy--]=arr[i];}for(; j>=start+mid+1; --j){copy[indexCopy--]=arr[j];}//返回值。return pairCount+leftInvertPair+rightInvertPair;}#endif
#include"invertDataCount.h"int main(){int arr[4]={7,5,6,4};std::cout<<invertDataPairCount(arr,4);}
标签:
原文地址:http://www.cnblogs.com/yml435/p/4655472.html