import java.util.Arrays;
/**
* 归并排序算法
* 中心思想:先将数组进行拆分,从中心一分为二,重复操作,直到剩下一个元素
* 接着对拆分后的数组重新进行组合,形成新的数组,组合过程中,进行排序
* 利用递归的思路进行拆分,直到剩下一个元素
*/
public class MergeSort {
public static int[] mergeSort(int[] array){
int size = array.length;
if (size < 2){
return array;
}
int mid = size >> 1; // 右移位1相当于除以2
// 将数组拆分为从0到中间位置
int[] leftArray = Arrays.copyOfRange(array,0,mid);
// 从中间位置到末尾
int[] rightArray = Arrays.copyOfRange(array,mid,size);
return merge(mergeSort(leftArray),mergeSort(rightArray));
}
/**
* 数组合并操作,整个大数组依次循环,进行数据对比
* 对比时,先比较当前数组下标是否越界,如发生越界,则说明越界侧数组已经完全合并入新数组
* @param left
* @param right
* @return
*/
public static int[] merge(int[] left,int[] right){
int[] newArray = new int[left.length+right.length];
int leftIndex = 0; // 记录左边数组遍历的下标
int rightIndex = 0; // 记录右边数组遍历的下标
for (int i = 0 ;i < newArray.length;i++){
if(leftIndex >= left.length){
// 左侧数组越界,新数组增加右侧数组的元素
newArray[i] = right[rightIndex++];
} else if (rightIndex >= right.length){
// 右侧数组越界,新数组增加左侧数组的元素
newArray[i] = left[leftIndex++];
} else if (left[leftIndex] > right[rightIndex]){
// 左侧数组***大于***右侧数组的元素,因此增加右侧数组的元素进新数组
newArray[i] = right[rightIndex++];
} else if(left[leftIndex] < right[rightIndex]){
// 左侧数组***小于***右侧数组的元素,因此增加左侧数组的元素进新数组
newArray[i] = left[leftIndex++];
}
}
return newArray;
}
public static void main(String[] args) {
int[] array = {5,3,1,6,4,7,0,9,10};
int[] ints = mergeSort(array);
System.out.println(Arrays.toString(ints));
}
}
归并排序算法
于 2022-01-23 10:18:50 首次发布