一、基本思想
归并算法采用分治思想,将数组的依次从中间拆分为两组,直到每个组只有一个元素位置。然后对拆分好的两组数进行归并,具体方法是:在左右两组都已经有序的前提下(只有一个数是一种特殊的有序),重建一个大小是左右两组数大小和的临时数组,然后对左右两个数组同时从前往后选最小的数放入新数组中。注意,如果如果一组元素放完了,另外一组剩余,这时无须比较,将剩余的元素直接放入临时数组。还有,不要忘记将临时数组的元素一次赋值到原来数组中。归并算法的时间复杂度为O(nlogn),空间复杂度为:O(n+logn)。
二、Java实现
public class mymergesort {
void merge(int[] array,int left,int right)
{
int mid=(left+right)/2;
if(left<right)
{
merge(array,left,mid);
merge(array,mid+1,right);
mergesort(array,left,mid,right);
}
}
private void mergesort(int[] array, int left, int mid, int right) {
int[] tmp_array=new int[right-left+1];
int index=0,i=left,j=mid+1;
while(i<=mid && j<=right)
{
if(array[i]<=array[j])
tmp_array[index++]=array[i++];
else
tmp_array[index++]=array[j++];
}
while(i<=mid)
tmp_array[index++]=array[i++];
while(j<=right)
tmp_array[index++]=array[j++];
for(int k=0,kk=left;k<right-left+1;k++)
array[kk++]=tmp_array[k];
for(int ele:array)
System.out.print(ele+" ");
System.out.println();
}
public static void main(String[] args)
{
int[] a={3,1,57,4,9,78,21,4,65,5,9,12,4,2};
new mymergesort().merge(a, 0, a.length-1);
}
}