时间复杂度:O(nlog₂n) 空间复杂度:O(n) 稳定;
思路:归并排序是建立在归并操作上的一种有效的排序算法,是采用分治法的一个典型应用; 即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
public class MergeSort {
public static void main(String[] args) {
Random ran=new Random();
int[] array=new int[99];
for (int i = 0; i <99 ; i++) {
array[i] = ran.nextInt(99)+1;
}
mergesort(array);
System.out.println(Arrays.toString(array));
}
public static void merge(int[] array,int gap){
int[] tmpArray=new int[array.length];
int i=0;
int s1=0;
int e1=s1+gap-1;
int s2=e1+1;
int e2=s2+gap-1>array.length-1 ? array.length-1:s2+gap-1;
while (s2<array.length){
while (s1<=e1&&s2<=e2){
if (array[s1]<array[s2]){
tmpArray[i++]=array[s1++];
}else {
tmpArray[i++]=array[s2++];
}
}
while (s1<=e1){
tmpArray[i++]=array[s1++];
}
while (s2<=e2){
tmpArray[i++]=array[s2++];
}
s1=e2+1;
e1=s1+gap-1;
s2=e1+1;
e2=s2+gap-1>array.length-1 ? array.length-1:s2+gap-1;
}
while (s1<array.length){
tmpArray[i++]=array[s1];
}
}
public static void mergesort(int[] array){
for (int i = 1; i <array.length ; i*=2) {
merge(array,i);
}
}
}