归并排序是基于分治的递归算法。类似前两篇博客所说的mapReduce思想和fork/Join框架。将原数组不断的分为两个大小相同的子数组,直到子数组的元素长度为1;然后将子数组进行排序; 再将排序后的结果进行合并
归并排序的递归公式:T(N) = 2T(N/2) + O(N)
时间复杂度:O(nlogn)
空间复杂度:O(n)。用到了一个临时数组,故空间复杂度为O(N)
/**
* 归并算法
*
* @author 石玉森
* @create 2019-03-12 11:52
**/
public class MergeSortDemo {
public static void main(String[] args) {
int []data = new int[8];
for(int i= 0;i<data.length ;i++){
data[i] = RandomUtils.nextInt(0,50);
}
//归并排序
mergeSort(data ,0 ,data.length-1);
for(int i = 0;i<data.length ;i++){
System.out.print(data[i]+" ");
}
}
//归并排序
public static int[] mergeSort(int[] data,int low,int high){
int mid = (low+high)/2;
if(low<high){
mergeSort(data,low,mid);
mergeSort(data,mid+1,high);
//左右归并
merge(data,low,mid,high);
}
return data;
}
//归并排序的辅助方法
public static void merge(int[] data, int low, int mid, int high) {
int[] temp = new int[high-low+1];
int i = low;
int j = mid+1;
int k = 0;
// 把较小的数先移到新数组中
while(i<=mid && j<=high){
if(data[i]<data[j]){
temp[k++] = data[i++];
}else{
temp[k++] = data[j++];
}
}
// 把左边剩余的数移入数组
while(i<=mid){
temp[k++] = data[i++];
}
// 把右边边剩余的数移入数组
while(j<=high){
temp[k++] = data[j++];
}
//将排好序的序列,重存回到 list 中 low 到 high 区
for(int x=0;x<temp.length;x++){
data[x+low] = temp[x];
}
}
}
原文:https://www.cnblogs.com/shiyusen/p/10533641.html