简介
归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并排序方法
让左右两边的序列先有序,然后将两个有序两个序列合并为一个有序的序列。 当两边只有一个元素的时候,这时候左右两边的序列都是有序序列。时间复杂度 O(log2 N * N) ,空间复杂度 O(N)。是稳定的排序算法。
归并排序代码
public class TestDemo2 {
//归并排序
//时间复杂度 O(log2 N * N) 空间复杂度 O(N)
//稳定
public static void merge(int[] array, int gap){
//gap表示归并段的长度
int left1 = 0;
int left2 = left1 + gap - 1;
int right1 = left2 + 1;
int right2 = (right1 + gap -1) < (array.length-1) ? (right1+gap-1) : (array.length-1);
//归并两个数据段
int[] tmp = new int[array.length];
int index = 0;
//保证左右两边都有归并的数据段
while(right1 < array.length){
while(left1 <= left2 && right1 <= right2){
if(array[left1] <= array[right1]){
tmp[index++] = array[left1++];
}else{
tmp[index++] = array[right1++];
}
}
//退出上面while循环
//右边的序列还未归并完
while(right1 <= right2){
tmp[index++] = array[right1++];
}
//左边的序列还未归并完
while(left1 <= left2){
tmp[index++] = array[left1++];
}
left1 = right2 + 1;
left2 = left1 + gap - 1;
right1 = left2 + 1;
right2 = (right1 + gap -1) < (array.length-1) ? (right1+gap-1) : (array.length-1);
}
//只有左边的一个归并段
while(left1 < array.length){
tmp[index++] = array[left1++];
}
//拷贝tmp到array数组中
for(int i=0; i<tmp.length; i++){
array[i] = tmp[i];
}
}
public static void mergeSort(int[] array){
//判断参数的合法性
if(array == null || array.length == 0){
return;
}
//确定归并段长度
for(int i=1; i<array.length; i*=2){
merge(array, i);
}
}
public static void main(String[] args) {
int[] array = {20, 100, 90, 19, 29, 39, 10, 25, 4, 3, 15, 36, 58, 98};
mergeSort(array);
System.out.println(Arrays.toString(array));
}
}