剑指offer-面试题51-数组中的逆序对-归并排序

/*
题目:
	求给定数组的逆序对数。
*/
/*
思路:
	归并排序。
*/

#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>


using namespace std;


int merge(int A[], int left,int mid,int right){
   int myCount = 0;
   int p1 = left;
   int p2 = mid + 1;
   int temp[right-left+1];
   int i = 0;
   while(p1 <= mid && p2 <= right){
        if(A[p1] > A[p2]){
            myCount = myCount + 1 + mid - p1;//右边数字大于左边数字的个数。
            temp[i] = A[p2];
            p2++;
        }else{
            temp[i] = A[p1];
            p1++;
        }
        i++;

   }
   while(p1 <= mid){
        temp[i++] = A[p1++];
   }
   while(p2 <= right){
        temp[i++] = A[p2++];
   }
   for(int i = left; i <= right; i++){
        A[i] = temp[i-left];
   }
   return myCount;
}
int sort(int A[], int left,int right) {
    if(left == right){
       return 0;
    }
    int mid = left + ((right-left) / 2);
    //cout<<left<<" "<<mid<<" "<<right<<endl;
    int num1 = sort(A,left,mid);
    int num2 = sort(A,mid+1,right);
    return merge(A,left,mid,right) + num1 + num2;
}

int main(){
    int a[] = {1,3,7,2,4,1};
    cout<<sort(a,0,5)<<endl;
    for(int i = 0; i < 6;i++){
        cout<<a[i]<<" ";
    }
    return 0;
}

    

猜你喜欢

转载自www.cnblogs.com/buaaZhhx/p/12074959.html