算法学习—— 逆序对求解
逆序对求解
对于一个包含N个非负整数的数组A[1..n],如果有i<j,且A[i]>A[j],则称(A[i] ,A[j] )为数组A中的一个逆序对。例如,数组(3,1,4,5,2)的逆序对有(3,1),(3,2),(4,2),(5,2),共4个。利用归并排序,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 int count = 0; 2 void merge(int* dataArr,int left,int center,int right) 3 { 4 int leftNum = center - left + 1; 5 int rightNum = right - center; 6 int leftArr[leftNum]; 7 int rightArr[rightNum]; 8 int i,j,k; 9 10 for(i = 0;i <leftNum;++i) 11 { 12 leftArr[i] = dataArr[left + i]; 13 } 14 15 for(j = 0;j < rightNum;++j) 16 { 17 rightArr[j] = dataArr[center + 1 + j]; 18 } 19 20 i = j = 0; 21 22 for(k = left;k < right;++k) 23 { 24 if(leftArr[i] <= rightArr[j]) 25 { 26 dataArr[k] = leftArr[i]; 27 ++i; 28 } 29 else 30 { 31 dataArr[k] = rightArr[j]; 32 /*刚开始没有考虑到,所以出错了! 33 如果leftArr[i] > rightArr[j],那么leftArr[i+1]leftArr[leftNum]都大于 rightArr[j]. 34 */ 35 for(int m = i; m < leftNum;++m) 36 { 37 cout<<"("<<leftArr[m]<<"-"<<rightArr[j]<<")"<<endl; 38 ++count; 39 } 40 ++j; 41 } 42 43 44 if(leftNum == i) 45 { 46 ++k; 47 for(;j < rightNum;++j) 48 { 49 dataArr[k] = rightArr[j]; 50 ++k; 51 } 52 } 53 54 if(rightNum == j) 55 { 56 ++k; 57 for(;i < leftNum;++i) 58 { 59 dataArr[k] = leftArr[i]; 60 ++k; 61 } 62 } 63 } 64 } 65 66 void mergeSort(int* dataArr,int left,int right) 67 { 68 if(left < right) 69 { 70 int center = (left + right) / 2; 71 mergeSort(dataArr,left,center); 72 mergeSort(dataArr,center + 1,right); 73 merge(dataArr,left,center,right); 74 } 75 }