package csu.sort;
import java.util.Arrays;
import java.util.Random;
/**
* 归并排序
* 基本思想:就是合并两个有序的数组,采用的是分治策略,把一个数组分为若干个子数组;
* 子数组的长度为1的时候,则子数组有序,于是可以两两归并
* 时间复杂度最好最坏的结果都是O(n*logn)
* 空间复杂度为O(n)
* @author wkp
*
*/
public class MergeSort {
/**
* @param a 有序数组a
* @param b 有序数组b
* @return arr 合并之后的有序数组arr
*/
public int[] mergeArr(int[] a,int[] b){
int[] arr = new int[a.length+b.length];//合并的数组
int i=0,j=0,k=0;
while(i<a.length&&j<b.length){
if(a[i]<b[j]){
arr[k++]=a[i];
i++;
}
else{
arr[k++]=b[j];
j++;
}
}
while(i<a.length){
arr[k++] = a[i++];
}
while(j<b.length){
arr[k++] = b[j++];
}
return arr;
}
public int[] mergeSort(int[] arr){
if(arr.length==1){
return arr;
}
int mid = arr.length/2;
int[] leftArr = new int[mid];
int[] rightArr = new int[arr.length-mid];
System.arraycopy(arr, 0, leftArr, 0,leftArr.length);
System.arraycopy(arr, mid, rightArr,0, rightArr.length);
leftArr = mergeSort(leftArr);
rightArr = mergeSort(rightArr);
return mergeArr(leftArr,rightArr);
}
public static void main(String[] args) {
Random ran = new Random();
int[] arr = new int[20];
for(int i=0;i<20;i++){
arr[i] = ran.nextInt(100);
}
MergeSort ms = new MergeSort();
ms.mergeSort(arr);
System.out.println(Arrays.toString(arr));
}
}
排序之二分排序
最新推荐文章于 2022-01-14 10:49:38 发布