算法学习—— 逆序对求解

逆序对求解

     对于一个包含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个。利用归并排序,代码如下:

View Code
 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 }

 

posted @ 2013-03-26 00:30  rockorange  阅读(323)  评论(0编辑  收藏  举报