//归并排序中之并 //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; }
|