逆序对

来源:互联网 发布:华为怎么卸载软件 编辑:程序博客网 时间:2024/04/29 04:24

设A[1…n]是一个包含n个不同数的数组。如果在i<j的情况下,有A[i]>A[j],则(i,j)就称为A中的一个逆序对(inversion)【《算法导论》2-4】

现给出一个数列,求该数列中的逆序对(逆序对 )

利用归并排序的方法我们给出如下算法:

////  main.cpp//  CpushTest////  Created by Ellen on 14-5-11.//  Copyright (c) 2014年 andy. All rights reserved.//#include <iostream>using namespace std;static int specialtime=0;void mergeSort(int *A,int left,int mid,int right){    int *L=new int[mid-left+1];    int *R=new int[right-mid+1];    int i,j;    for(i=0;i<mid-left+1;i++)    {        L[i]=A[left+i];    }    for (j=0; j<right-mid; j++)    {        R[j]=A[mid+j+1];    }    i=0,j=0;    int k=left;    while(i<mid-left+1 && j<right-mid)    {        if(L[i]<=R[j])        {            A[k++]=L[i++];        }else        {            A[k++]=R[j++];            specialtime+=mid-left+1-i;        }    }    while (i<mid-left+1)    {        //specialtime++;        A[k++]=L[i++];    }    while (j<right-mid)    {        A[k++]=R[j++];    }    delete []L;    delete []R;    }void merge(int *A,int left,int right){    if (left<right)    {        int mid=(right-left)/2+left;        merge(A,left,mid);        merge(A,mid+1,right);        mergeSort(A,left,mid,right);    }    }int main(int argc, const char * argv[]){    int A[]={100,11,43,65};    //int A[]={56,3,5,68,100,32};    //int A[]={68,100,32};    merge(A,0,sizeof(A)/sizeof(int)-1);    for(int i=0;i<sizeof(A)/sizeof(int);i++)    {       cout<<A[i]<<"   ";    }    cout <<endl;    cout<<"逆序对是 "<<specialtime<<endl;    return 0;}

0 0
原创粉丝点击