poj2299

据说这是我的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;
    }




}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值