归并排序用到的方法就是分治法(divided-conquer-combined)
思想就是:将数组分成两个数组,如果两个数组的元素都是有序的,那么就可以很方便的将这两组数据归并。如果没有序继续将两组数组分组,以此类推,当组内只有一个数据时,认为这个小组内已经有序,然后合并相邻两个小组就可以。
Java代码如下
package sort;
//归并排序
//2015-05-31
public class MergeSort {
//归并排序用的是分治法,divided——conquer——combined
public void mergesort(int a[],int first,int last,int temp[]){
if(first==last){
temp[first]=a[first];
}
else {int mid=(first+last)/2;
//递归
//对左边进行排序
mergesort(a,first,mid,temp);
//对右边进行排序
mergesort(a,mid+1,last,temp);
//进行归并
mergearray(a,first,mid,last,temp);
}
}
public void mergearray(int a[],int first,int mid,int last,int temp[]){
int i=first;
int j=mid+1;
int m=mid;
int n=last;
int k=0;
while(i<=m&&j<=last){
if(a[i]<a[j]){
temp[k++]=a[i++];
}
else {
temp[k++]=a[j++];
}
}
while(i<=m){
temp[k++]=a[i++];
}
while(j<=n){
temp[k++]=a[j++];
}
for(i=0;i<k;i++){
a[i+first]=temp[i];
}
}
}
这里遇到的问题有两个
case1:递归导致内存溢出
if(first==last){
temp[first]=a[first];
}
else {int mid=(first+last)/2;
//递归
当时没有对first和last进行比较,结果导致内存溢出
case2: 数组初始化是没有给定
int[] temp = new int[a.length ] ;
该过即可正常编译通过