据说这是我的poj的有一个突破,归并排序,话说它折磨我好长时间了,为什么呢?我的递归好像出了问题,不知道咋运行的了.例如先来个二叉树的中序便利
template<class T> void tree<T>::order_in(tree_node<T> *p)
{
if (p)
{
order_in(p->lchild);
cout<<p->value;
order_in(p->rchild);
}
}
原来就是得过且过得感觉,现在我知道了他的过程.
并且可以认为他的三个过程是并行的,就是同时发生的,什么意思呢
就是
可以理解为并行的,而实际的计算机的操作过程应该是怎么样的呢
一直取自己的左区间,然后直到头为止,然后,一直都是这个过程....
递归最美的一点就是递归返回的就是完美的结果,而完美结果的保证就是分而治之,
问题规模变下的时候解决方案是一样的.
<pre name="code" class="cpp">#include<algorithm>
#include<iostream>
using namespace std;
long long k=0;
int a[500000 ];
int b[500000 ];
void Merge(int *R,int low,int mid,int high)
{
int i=low,j=mid+1,p=0;
while(i<=mid&&j<=high)
{
if(R[i]<=R[j])
{
b[p++]=R[i++];
}
else
{
b[p++]=R[j++];
k+=mid-i+1;/*此语句就是求逆序数原理就是如果需要交换的话,
*那么从i到mid这一段的都比它大,所以根据逆序数的定义<span style="white-space:pre"> </span>
*那就是逆序数*/
}
}
while(i<=mid)
b[p++]=R[i++];
while(j<=high)
b[p++]=R[j++];
for(p=0,i=low;i<=high;p++,i++)
{
a[i]=b[p];
}
}
void Merges(int *R,int low,int high)
{
int mid ;
if(low<high)
{
mid=(low+high)/2;
Merges(R,low,mid);
Merges(R,mid+1,high);
Merge(R,low,mid,high);
}
}
int main()
{
std::ios::sync_with_stdio(false);
int n;
while(cin>>n)
{
k=0;
if(n==0)
break;
for(int i=0;i<n;i++)
cin>>a[i];
Merges(a,0,n-1);
cout<<k<<endl;
}
}