三个函数实现归并排序:
基本思路:每次把数组一分为二,分别排序,最后通过merge函数实现整个数组的排序。
具体思路我们通过代码来讲解:
第一个函数:
public static void mergeSort(int[] arr)
{
if(arr==null||arr.length<2)//传入空指针或者数组的长度小于二,直接返回。
return ;
process(arr,0,arr.length-1);//在process中数组排序。
}
第二个函数:
public static void process(int[] arr,int l,int r)//利用process函数递归实现数组排序
{
if(l==r)//此时只传入一个元素,不用排序,可以直接返回,此时递归结束。
return ;
int mid=l+(r-l)/2;//mid代表此时数组的中间值
process(arr,l,mid);//递归排序数组l到mid的部分
process(arr,mid+1,r);//递归排序数组mid+1到r的部分
merge(arr,l,mid,r);//执行到此函数时l到mid部分和mid+1到r部分都已有序
//此时需要实现merge函数使这两个部分有序的函数在函数整体上有序。
}
第三个函数:
原理:此时数组的(l——m)部分通过process函数已经变得有序了,(m+1——r)部分也通过process函数变得有序了,那merge函数只需要开辟一个新的空间,通过两个指针来维护指向数组两个部分的最小值,不断地把两个指针指向的较小数放到开辟的新空间中,保证新空间有序,直到把这两个部分的数都放到新开辟的空间中,归并结束,数组有序。
图示:
public static void merge(int []arr,int l,int m,int r)
{
//merge函数实现数组l到m部分和m+1到r部分上的整体有序
int[] help=new int[r-l+1];
int i=0;
int p1=l;
int p2=m+1;
while(p1<=m&&p2<=r)
{
help[i++]=arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];
}
while(p1<=m)
help[i++]=arr[p1++];
while(p2<=r)
help[i++]=arr[p2++];
for(int i1=0;i1<help.length;i1++)
arr[l+i1]=help[i1];
}