归并排序算法的思想是分治法:将整个需要排序的数列首先分割成A,B的;如果A,B两个数列有序则分别依次取A,B中最小的数即可。然后就把问题分割成对A,B两个数列中排序。这样一直分割下去,直到一个数列只有一个数据,则开始两两合并数列。最终合并成使得原始的需要排序的数列变成有序的数列。
它的时间复杂度是:O(N*logN)
空间复杂度是:O(N);
归并排序算法是个牺牲空间换时间的算法。而且它是效率高而且稳定的算法。
其Java实现如下
public class MergeSort {
public static void main(String[] args){
int [] a = {12,1,22,3,4,65,9,14};
merge(a,0,a.length-1);
}
/**
*分割数列
*/
public static void merge(int[] a,int start,int end){
if(start >= end){
return;
}
merge(a,start,(start+end)/2);
merge(a,(start+end)/2+1 ,end);
mergedSort(a,start,end);
}
/**
*合并数列
*空间复杂度在这里体现,有个临时数组temp[]
*/
public static void mergerSort(int[] a,int start,int end){
System.out.println(" start: "+start +" end :"+end);
int[] temp = new int[end-start+1];
int in_start = start;
int in_end = end;
int index = 0;
int middle = (in_end + in_start)/2;
int middle1=middle+1;
while(in_start <= middle && in_end >= middle1){
if(a[in_start] <= a[middle1] ){
temp[index++] = a[in_start++];
}else{
temp[index++] = a[middle1++];
}
};
while(in_start <= middle){
temp[index++] = a[in_start++];
}
while(middle1 <= in_end){
temp[index++] = a[middle1++];
}
for(int ij = 0;ij < temp.length;++ij){
a[ij+start] = temp[ij];
}
print(a);
}
/**
*输出数组
*/
public static void print(int[] a){
for(int i:a){
System.out.print(i+",");
}
System.out.println();
}
}