逆序对的查找

来源:互联网 发布:铁路造价软件培训 编辑:程序博客网 时间:2024/06/03 12:30

算法导论在第二章的最后2-4小题中提到了查找逆序对的问题。
其实我认为,查找逆序对其实就是排序的过程,比如3,2,1
插入排序的过程就是3,2-3,1-2-3.需要3次交换位置,这正好也是逆序对的数目(这里针对的只能是数组,如果是链表则不是这样)。
所以他要求在nLgn的时间计算出逆序对的数量,正好可以采用归并排序。

#include<stdio.h>#include<stdlib.h>int  merge(int *A, int left ,int mid, int right){   int i;   int j;   int Tl[8];   int Tr[8];   int lnum;   int rnum;   int inversion = 0;   lnum = mid-left+1;   rnum = right - mid;   //assinment    for(i =0;i<lnum;i++)       Tl[i]=A[left+i];   for(j =0;j<rnum;j++)       Tr[j] = A[mid+j+1];   i = 0;   j =0;   while(i<(lnum)&&j<(rnum))   {       if(Tl[i]<Tr[j])           A[left++] = Tl[i++];       else       {           A[left++] = Tr[j++];           //for (4,5)(2,3)           //Tl[0]>Tr[0],so inversion + lnum;           //then Tl[1]>Tr[0] ,also +lnum           inversion+=lnum -i;       }   }   while(i<(lnum))   {       A[left++] = Tl[i++];   }   while(j<(rnum))   {       A[left++] = Tr[j++];   }   return inversion;}int  merge_sort(int *A,int left,int right)    {         int mid;         int inversion = 0;        if(left<right)        {            mid = (left+right)/2;            //count steps            inversion += merge_sort(A,left,mid);            inversion += merge_sort(A,mid+1,right);            inversion += merge(A,left,mid,right);        }        return inversion;    }int main(){    int A[8] = {5,4,3,2,1,0,7,6};    int sum;    //merge sort    sum = merge_sort(A,0,7);}
0 0