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;
}
//归并排序中之并
//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;
}
梦想与现实的落差,就是我们离成功的距离~