Mergesort
是建立在归并操作上的一种有效的排序算法,
该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;
即先使每个子序列有序,再使子序列段间有序。
若将两个有序表合并成一个有序表,称为二路归并。
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] arr = {1,7,10,9,5,2,17,8,4,0};
mergeSort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
/**
* 该方法是将数组分成两边比较,
* low到mind mid+1到high各为一组,边遍历边比较,
* 将小者放入临时数组中,完成数组的升序
* @param arr 需要排序的数组
* @param low 数组的起始位(低位)
* @param middle 数组的中间位置
* @param high 数组的末尾(高位)
*/
public static void merge(int[] arr,int low,int middle,int high) {
int[] temp = new int[high-low+1]; //临时数组大小应为low到high的范围
int i = low; //i从低位开始遍历
int j = middle+1; //j从mid+1开始遍历
int index = 0; //index作为临时数组temp的索引
while(i<=middle && j<=high) { //i和j在各自范围内遍历
if(arr[i]<=arr[j]) { //比较的最小值取出放入临时数组中
temp[index++] = arr[i];
i++;
}else {
temp[index++] = arr[j];
j++;
}
}
while(i<=middle) { //此处当某一边元素取完,将另一边剩余元素放入temp
temp[index++] = arr[i];
i++;
}
while(j<=high) {
temp[index++] = arr[j];
j++;
}
for(int k=0;k<temp.length;k++) {
arr[low+k] = temp[k];
}
}
public static void mergeSort(int[] arr,int low,int high) {
int middle = (high+low)/2;
if(low<high) { //将数组拆分成两边,进行递归
//需要将数组每一块拆成足够小
mergeSort(arr,low,middle);
mergeSort(arr,middle+1,high);
merge(arr,low,middle,high);
}
}
}