package com.zhao.algorithm.sort;
import java.util.Arrays;
/**
* AUTHOR :zhao
* 日期:2020/2/14 19:10
* 归并排序
* 将一个数组中2边有序的子数组进行排序
* 左边的数据不断递归排序语序,右边同理
*/
public class MergeSort {
public static void main(String[] args) {
// int array[]={60,56};
// merge(array,0,0,array.length-1);
// System.out.println(Arrays.toString(array));
int[] array ={60,56,1,4,5,0,12,10,9,7,4,5,2,4,3};
mergeSort(array,0,array.length-1);
System.out.println(Arrays.toString(array));
}
/**
* 将一个数组中指定的位置进行归并排序
* @param arr 数组
* @param left 开始排序的数组下标
* @param right 右边数据的最后一个元素下标
*/
static void mergeSort(int[]arr ,int left,int right){
//中间下标
int middle=(right+left)/2;
//结束条件 当左右2边下标重合时
if(left<right) {
//左边的进行排序
mergeSort(arr, left, middle);
//右边的进行排序
mergeSort(arr, middle + 1, right);
//归并
merge(arr, left, middle, right);
}
}
/**
* 将一个数组分为2部分进行归并
* @param arr 数组
* @param left 开始排序的数组下标
* @param mid 从哪里将这个数据分为2部分
* @param right 右边数据的最后一个元素下标
*/
static void merge(int[]arr ,int left,int mid,int right){
//声明一个临时数据存放归并后的元素
int[] tmp = new int[right-left+1];
//左边数组需要遍历的下标
int low=left;
//右边数组需要遍历的下标
int high=mid+1;
//临时数组的下标
int index=0;
//在左右数组都有数值的情况下进行遍历
while (low<=mid&&high<=right){
//左边数组小存放左边数组值到临时数组中
if(arr[low]<arr[high]){
tmp[index++]=arr[low++];
}else {
//you边数组小存放左边数组值到临时数组中
tmp[index++]=arr[high++];
}
}
//遍历长一点的数组的剩余值到临时数组中
while (low<=mid){
tmp[index++]=arr[low++];
}
//右边的
while (high<=right){
tmp[index++]=arr[high++];
}
//把临时数组放回原数组中
for (int i = 0; i <tmp.length ; i++) {
arr[i+left]=tmp[i];
}
}
}