归并排序
基本思想
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。1
从图上就能很明确的看出归并算法的原理, 这种结构也很像一颗完全二叉树
package sortalgorithm;
import java.util.Arrays;
/**
* @author: xingt mym_74@163.com
* @date: 2019/10/22, 20:05
* @version: 1.0
*/
public class MergeSort {
public static void main(String[] args) {
int[] arr1 = new int[]{1,5,7,8,2,3,7,7,9};
System.out.println("排序前的数组为:"+ Arrays.toString(arr1));
mergesort(arr1,0,arr1.length-1);
System.out.println("mergesort后的数组为:" + Arrays.toString(arr1));
}
//归并排序
private static void mergesort(int[] arr, int low, int high){
// 将middle取值为中间值, high+low 而不是high-low 是因为操作的是原数组中 的索引,而不是merge中新建一个数组得到新数组的长度
int middle=(high+low)/2;
//low<high 是递归的停止,也就是只有一个数字了
if(low<high) {
//处理左边
mergesort(arr, low, middle);
//处理右边
mergesort(arr, middle + 1, high);
//归并的操作
merge(arr, low, middle, high);
}
}
private static void merge(int[] arr, int low, int middle , int high){
//临时数组用于储存变量
int[] temp = new int[high-low+1];
//记录第一个数组需要遍历的下标
int i = low;
//记录第二个数组需要遍历的下标
int j = middle+1;
//记录临时数组需要存放的下标
int index = 0;
//遍历2个数组,小的放入到temp数组里面
while(i<=middle && j<=high) {
if (arr[i] < arr[j]) {
temp[index] = arr[i];
i++;
} else {
temp[index] = arr[j];
j++;
}
index++;
}
//遍历完一边的数组之后,处理剩余的数组
while(i<=middle){
temp[index]=arr[i];
i++;
index++;
}
while(j<=high){
temp[index]=arr[j];
j++;
index++;
}
// copy 临时数组到arr中去, 也就是从arr的low位置开始放
for(int k=0;k< temp.length; k++){
arr[k+low] = temp[k];
}
}
}