c++合並兩個序列函數merge()和inplace_merge()


大家在寫歸並排序時是不是覺得合並兩個序列有點麻煩,有快速的方法嗎?

我們全部函數自己寫,比如:

#include<bits/stdc++.h>
using namespace std;
#define MAX_SIZE 50000
int mydata[MAX_SIZE+5];
int mysize;//向量元素實際個數void my_merge(int lo,int mi,int hi)//合並兩個序列 
{
    //A分為b,c左右兩個數組 
    int  *A=mydata+lo;//合並后的向量
    int *C=mydata+mi;
    int lb=mi-lo,lc=hi-mi; //b,c數組的長度
    int *B=new int[lb];//創建B數組=A[0-lb]
    //int *B=(int*)malloc(sizeof(int)*lb);
    for(int i=0;i<lb;i++) B[i]=A[i]; //復制 
    int j=0,k=0;//b,c 
    for(int i=0;j<lb;){
        if(j<lb&&(B[j]<=C[k]|| k>=lc/*c空了*/ )) A[i++]=B[j++];
        if(k<lc&&(C[k]<B[j])) A[i++]=C[k++];
    }//時間< O(n) 
    delete [] B;
    //free(B);
}//一共logn層 
void mergeSort(int lo,int hi)//歸並排序 
{
    int mi=(lo+hi)>>1;
    if(lo+2>hi) return;
    mergeSort(lo,mi);
    mergeSort(mi,hi);//分治 
    my_merge(lo,mi,hi);//合並 
}//歸並排序總的時間復雜度 
int main(void)
{
    int n;
    scanf("%d",&n);
    mysize=n;
    for(int i=0;i<n;i++)
        scanf("%d",&mydata[i]);
        mergeSort(0,mysize);
    return 0;
}

我們首先會想到C++algorithm里的merge()函數,merge函數可以把兩個有序的序列變成一個新的有序序列(注意是新的),這里是設計三個序列,並不能在原序列上進行操作,可是歸並排序要在原序列進行操作。

那么還有一個函數似乎可以幫到我們,inplace_merge()。inplace_merge()有三個必須參數,默認合並后排序是升序的,第一個參數是一個序列的起始位置,第二個是該序列的切分位置,第三個參數是該序列區間的結束位置。

比如:

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
	int t,n;
	int z[10]={5,6,7,8,9,0,1,2,3,4};
	int b[15];
	inplace_merge(z,z+5,z+10);
	for(int i=0;i<10;i++)
	printf("%d ",z[i]);
	return 0;
}

  這兩個函數詳細解析請點擊(地址為http://c.biancheng.net/view/568.html)

代碼實現請看:

https://www.cnblogs.com/cchun/archive/2012/05/26/2519394.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM