package com.zjh.web.util.arithmetic.sort;
import java.util.Arrays;
/**
*归并算法
* des:将一个长度为 n的数组 拆分成两个n/2 和 length-n/2(此操作是为了防止n为奇数,拉下最后一个) 的两个子数组
* 在对两个字数组使用归并排序
* 将排好序的子数组排序并合并
*/
public class RegressionMergerSort implements Sort {
private static int[] arrays = new int[]{8,9,1,7,2,3,5,4,6,0};
public static void main(String[] args) {
RegressionMergerSort ms = new RegressionMergerSort();
ms.sort(arrays);
//MergerSort.mergeSort(arrays);
ArraysPrints.printArrays(arrays);
}
@Override
public void sort(int[] arrays) {
this.arrays = RegressionMergerSort.mergerSort(arrays);
}
/**
* 采用递归拆分数组
* des: 将一个数组拆分成两个数组,除非数组中只有一个值时不用拆分直接返回
* 1.判断数组是否小于等于1 如果是不用拆分和对比直接返回其本身
* 2.拆分数组
* 3.对比已经拆分的数组,如果对比的数组大于1则再次调用本身从而达到继续拆分“对比数组”并对比
*
* @param arrays
* @return
*/
public static int[] mergerSort(int[] arrays){
//递归要素之一(结束条件,避免死循环)
if(arrays.length<=1)return arrays;
int l = arrays.length;
int centre = l/2;
int left[] = Arrays.copyOfRange(arrays,0,centre);
int right[] = Arrays.copyOfRange(arrays,centre,l);
return contrast(mergerSort(left),mergerSort(right));
}
/**
* 对比数组
* des:对比两个数组
* 其中 “index”索引控制新数组的指针位置
* 其中 “leftIndex”索引控制left数组的指针位置
* 其中 “rightIndex”索引控制right数组的指针位置
* @param left
* @param right
* @return
*/
public static int[] contrast(int[] left,int[] right){
int[] arrays = new int[left.length + right.length];
int leftIndex = 0;
int rightIndex = 0;
for(int index = 0;index<arrays.length;index++){
//判断left 数组中是否全部比对完毕【当leftIndex大于等于left的长度时说明遍历已经将left数组全部遍历完并放入到新数组中,直接将right放入到新数组中即可】
//已知此方法是通过递归拆分到最小个数 数组而来(也就是length = 1),所以left数组或者right数组各自数组内部已经按从小到大顺序排列好
if(left.length<=leftIndex){
arrays[index] = right[rightIndex];
rightIndex++;
}else if(right.length<=rightIndex){
arrays[index] = left[leftIndex];
leftIndex++;
}else if(left[leftIndex]>right[rightIndex]){
arrays[index] = right[rightIndex];
//right数组在rightIndex位置的值已经比对完毕放入到新数组中下次遍历需要比对rightIndex+1 位置的值所以需要rightIndex++
rightIndex++;
}else{
arrays[index] = left[leftIndex];
//left数组在leftIndex位置的值已经比对完毕放入到新数组中下次遍历需要比对leftIndex+1 位置的值所以需要leftIndex++
leftIndex++;
}
}
return arrays;
}
}
归并算法 java 代码 skr
最新推荐文章于 2024-06-14 15:02:13 发布