您的位置:首页 > 其它

归并的两种方法

2017-11-20 21:06 106 查看
void Merge(int* data,int* tmp,int left,int right,int rightend)

{

    int leftend = right-1;

    int size = rightend-left+1;

    int cnt = left;

    while(left <= leftend && right <= rightend){

        if(data[left] < data[right]){

            tmp[cnt++] = data[left++];

        }else{

            tmp[cnt++] = data[right++];

        }

    }

    while(left <= leftend){

        tmp[cnt++] = data[left++];

    }

    while(right <= rightend){

        tmp[cnt++] = data[right++];

    }

    for(int i =0 ; i <size ; i++,rightend--){

        data[rightend] = tmp[rightend];

    }

}

//归并排序

void Msort(int* data,int* tmp,int left,int rightend)

{

    if(left < rightend){

        int mid = (left+rightend)/2;

        Msort(data,tmp,left,mid);

        Msort(data,tmp,mid+1,rightend);

        Merge(data,tmp,left,mid+1,rightend);

    }

}

//归并排序(递归版本)

void Merge_Sort(int* data,intsize)

{

    int* tmp = new int[size];

    if(tmp != NULL){

        Msort(data,tmp,0,size-1);

    }

简化之后,第二种:

int a[100010],b[100010],n;//定义全局变量

long long s;

void ssort(int sta,int end)

{   

    if(end-sta<=1)      

     return;  

    int m=(sta+end)/2;  

    ssort(sta,m);   

    ssort(m,end);  

 

 int i,j,k;   

 i=sta;   

 j=m;   

 k=sta;               

 while(i<m||j<end)   

    {      

     if(j>=end||(i<m&&a[i]<=a[j]))           

   b[k++]=a[i++];       

     else     

     {          

      if(i<m)         

       s=s+m-i;        

   b[k++]=a[j++];     

       }  

    }   

   

 for(i=sta;i<end;i++)     

      a[i]=b[i];

    //int mum=0; mum++; 

 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  归并