from:http://www.cnblogs.com/architect/archive/2009/05/06/1450489.html
//归并排序中之并
//Updated by zivsoft at 05/06/2009
int *Merge(int *a,int aLength,int *b,int bLength){
    
//合并结果指针
    int *result;
    
//初始化结果指针
    result=new int[aLength+bLength];

    
int i=0,j=0,k=0;

    
//定义左指针
    a=new int[aLength];
    
//定义右指针
    b=new int[bLength];

    
//元素排序,左右比较
    while(i<aLength&&j<bLength){
        
if(a[i]<b[j]){//左元素小于右元素
            result[k++]=a[i++];//将小的赋值到结果
        }
        
else{//左元素大于右元素
            result[k++]=b[j++];//将小的赋值到结果
        }
    }
    
while(i<aLength){//将最后一个元素赋值到结果
        result[k++]=a[i++];
    }
    
while(j<bLength){//将最后一个元素赋值到结果
        result[k++]=b[j++];
    }
    
return result;
}

//归并排序中之归拆分
//Updated by zivsoft at 05/06/2009
int *Split(int *data,int length){
    
int i=0,j=0,k=0;
    
int *left,*right,*result;
    
//取中间下标
    int middle=length/2;
    left
=new int[middle];
    right
=new int[middle];
    
//初始化有序结果数组
    result=new int[length];
    
//如果数组只有一个元素,直接返回,无需排序
    if(length<=1){
        
return data;
    }
    
int rightLength=0;

    
//奇数个元素的话,重新分配右数组长度
    if(length%2!=0){
        delete[] right;
        rightLength
=middle+1;
        right
=new int[rightLength];
    }
    
//拆分数组
    for(k=0;k<length;k++){
        
if(i<middle){
            left[i
++]=data[k];
        }
        
else{
            right[j
++]=data[k];
        }
    }
    left
=Split(left,i);//递归拆分左数组
    right=Split(right,rightLength);//递归拆分右数组
    result=Merge(left,i,right,rightLength);//排序并合并
    
//printarray(result,k); //输出,供lihua(zorywa)侧使用(zivsoft)
    return result;
}
posted on 2009-09-19 04:58  AlexusLi  阅读(520)  评论(0编辑  收藏  举报