1. 什么是归并排序
归并排序就是将两个有序的数组并成一个更大的有序数组的递归排序算法。
2. 代码描述
一.自顶向下的归并排序
public class MergeSort
{
private static int[] x;
public static void merge(int[] array,int start,int mid,int end)//在左右两边有序的情况下,进行原地归并
{
int i=start;
int j=mid+1;
for(int k=start;k<=end;k++)//将array[start..end]复制到x[start..end]中
{
x[k]=array[k];
}
for(int k=start;k<=end;k++)
{
if(i>mid) array[k]=x[j++];//3.左半边用尽,取右半边的元素
else if(j>end) array[k]=x[i++];//4.右半边的元素用尽,取左半边的元素
else if(x[j]<x[i]) array[k]=x[j++];//1.右半边的当前元素小于左半边的当前元素,取右半边的元素
else array[k]=x[i++];//2.右半边的当前元素大于或等于左半边的元素,取左半边的元素
}
}
public static void sort(int[] array)
{
x=new int[array.length];
sort(array,0,array.length-1);
}
public static void sort(int[] array,int start,int end)//重载一个sort方法,进行递归操作
{
if(end<=start) return;
//自顶向下进行递归,将数组分解到左右两边只剩下一个元素,然后直接原地归并
int mid=start+(end-start)/2;
sort(array,start,mid);
sort(array,mid+1,end);
merge(array,start,mid,end);
}
public static boolean isSorted(int[] array)//判断排序是否正确
{
for(int i=1;i<array.length;i++)
{
if(array[i]<array[i-1])
{
System.out.println("false");
return false;//在排序有错时跳出循环
}
}
System.out.println("排序结果正确,输出结果为:");
return true;
}
public static void show(int[] array) //排序之后输出结果
{
for(int i=0;i<array.length;i++)
{
System.out.print(array[i]+" ");
}
}
public static void main(String[] args)
{
int[] array={5,13,3,7,4,16,18,11,2,3,9};
sort(array);
isSorted(array);
show(array);
}
}
二.自底向上
public static void sort(int[] array)
{
x=new int[array.length];
for(int s=1;s<array.length;s=s+s)
{
for(int start=0;start<array.length-s;start+=s+s)
{
merge(array,start,start+s-1,Math.min(start+s+s-1, array.length-1));
}
}
}
3. 算法特点
对于任意长度为N的数组,归并排序都需要1/2NlgN至NlgN次比较,最多访问数组6NlgN次