【编程题】归并排序(java实现)
思路
从小到大的解释:将数组中的元素看成单个的元素,然后两两排序,再四四排序,依次合并到最后的有序数组。
从大到小的解释:将数组分为两堆,分别拆分递归,再进行排序好的数组合并。
代码
时间复杂度O(nlogn),空间复杂度O(n)
package sort;
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args){
int[] a={4,8,1,5,3,6};
mergeSort(a);
System.out.println(Arrays.toString(a));
}
static void mergeSort(int[] arr){
if(arr==null||arr.length<=0)
return;
mergeSort(arr,0,arr.length-1);
}
static void mergeSort(int[] arr,int low,int high){
if(low==high)
return;
int mid=(low+high)>>1;
mergeSort(arr,low,mid);
mergeSort(arr,mid+1,high);
merge(arr,low,high);
}
static void merge(int[] arr,int low,int high){
int index=0;
int mid=(low+high)>>1;
int i=low,j=mid+1;
int[] help=new int[high-low+1];
while (i<=mid&&j<=high){
help[index++]=arr[i]<arr[j]?arr[i++]:arr[j++];
}
while (i<=mid){
help[index++]=arr[i++];
}
while (j<=high){
help[index++]=arr[j++];
}
for(int k=low;k<=high;k++)
arr[k]=help[k-low];
}
}