归并排序
思想
把一个数组分成两半,排序每一半,然后把排好序的两半归并成一个有序的数组,那么如何为每一半排序呢?递归调用自身就行啦!
示例
关键代码
public static void sort(int[] array,int left,int right){
if(left>=right){
return;
}
int center=(right+left)/2;
sort(array,left,center);
sort(array,center+1,right);
merge(array,left,center,right);
}
public static void merge(int[] array,int left,int center,int right){
int[] temp = new int[array.length];
int i=left,j=center+1;
int k=left;
while(i<=center&&j<=right){
if(array[i]<array[j]){
temp[k++]=array[i++];
}else{
temp[k++]=array[j++];
}
}
//没有提前遍历完
if(i==center+1){
while(j<=right){
temp[k++]=array[j++];
}
}
if(j==right+1){
while(i<=center){
temp[k++]=array[i++];
}
}
k=left;//让k指针从头开始
while(k<=right){
array[k]=temp[k];
k++;
}
}
复杂度
归并排序和快速排序有那么点异曲同工之妙,快速排序:是先把数组粗略的排序成两个子数组,然后递归再粗略分两个子数组,直到子数组里面只有一个元素,那么就自然排好序了,可以总结为先排序再递归;归并排序:先什么都不管,把数组分为两个子数组,一直递归把数组划分为两个子数组,直到数组里只有一个元素,这时候才开始排序,让两个数组间排好序,依次按照递归的返回来把两个数组进行排好序,到最后就可以把整个数组排好序;该算法的最优时间复杂度和最差时间复杂度及平均时间复杂度都是一样的为:O( nlogn )。