[算法] 归并排序实现(递归版本和非递归版本)
归并排序实现
一、递归版本
在递归版本的实现当中我们不需要太在意边界问题。
public void merge(int []num,int start, int mid, int end){
int [] left = new int[mid-start+1];
int []right=new int[end-mid];
for(int i=0;i<mid-start+1;i++) left[i]=num[start+i];
for(int i=0;i<end-mid;i++) right[i]=num[mid+1+i];
int leftindex = start, rightindex = mid+1;
int index = start;
while(leftindex<=mid&&rightindex<=end){
if(left[leftindex]<right[rightindex]){
num[index]=left[leftindex];
leftindex++;
}else{
num[index]=right[rightindex];
rightindex++;
}
index++;
}
while(leftindex<=mid) num[index++]=left[leftindex++];
while(rightindex<=end) num[index++]=right[rightindex++];
}
public void mergeSort(int []num,int start,int end){
//如果只有一个元素那么,说明已经排好序了
if(start<end){
int mid = (start+end)/2;
mergeSort(num,start,mid);
mergeSort(num,mid+1,end);
merge(num,start,mid,end);
}
}
二、非递归版本
通过设置不同的gap,使用自底向上的方式来进行排序,较大的gap利用较小的gap的排序结果
void merge();同上
public void mergeSort-interate(int []num){
for(int gap = 1;gap<=num.length;gap*=2){
int index = 0;
while((index+2*gap)<num.length){
merge(num,index,index+gap-1,index+2*gap-1);
index = index + 2*gap;
}
//尾部可能不足2*gap的长度
if(index+gap<num.length)
merge(num,index,index+gap-1,num.length-1);
}
}