Java实现归并排序

来源:互联网 发布:程序员面试宝典 编辑:程序博客网 时间:2024/05/18 01:50

归并排序用到的方法就是分治法(divided-conquer-combined)

思想就是:将数组分成两个数组,如果两个数组的元素都是有序的,那么就可以很方便的将这两组数据归并。如果没有序继续将两组数组分组,以此类推,当组内只有一个数据时,认为这个小组内已经有序,然后合并相邻两个小组就可以。

Java代码如下

package sort;//归并排序//2015-05-31public 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 ] ;

该过即可正常编译通过

0 0
原创粉丝点击