1.归并排序算法的思想
归并排序主要是使用了递归排序的算法。采用分治思想的策略。要将一个数组排序,先递归地将它分成两半分别排序,然后将结果归并起来。由于需要将两个数组归并到第三个新的数组中去。所以应当创建一个适当大小的数组,然后将两个输入数组中的元素一个个从小到大放入这个数组中。所以总的来看就是将大排序分成多个子部分进行排序,然后再归并到一起。
2.归并排序算法的特点
对于长度为N的任意数组,自顶向下的归并排序需要1/2*N*lgN至N*lgN比较。
对于长度为N的任意数组,自顶向下的归并排序最多需要访问数组6*N*lgN次。
归并排序的缺点就是辅助数组所使用的额外空间和N的大小成正比。
3.归并排序算法的实现
public class MergeSort {
private static double[] aux;
public static void merge(double[] arr,int start,int mid,int end){
int i=start,j=mid+1;
for(int k=start;k<=end;k++){
aux[k]=arr[k];
}
for(int k=start;k<=end;k++){
if(i>mid){
arr[k]=aux[j++];
}else if(j>end){
arr[k]=aux[i++];
}else if(aux[j]<=aux[i]){
arr[k]=aux[j++];
}else{
arr[k]=aux[i++];
}
}
}
public static void sort(double[] arr){
aux=new double[arr.length];
inputSort(arr,0,arr.length-1);
}
private static void inputSort(double[] arr,int start,int end){
if(end <=start){
return;
}
int mid=start+(end-start)/2;
//数组从start~mid之间递归排序
inputSort(arr,start,mid);
//数组从mid+1~end之间递归排序
inputSort(arr,mid+1,end);
//将两个输入数组合并
merge(arr,start,mid,end);
}
public static void main(String[] args) {
double[] arr={3,8,9,32,2,20,1,4,7,5,5};
sort(arr);
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}
结果: