一、归并排序介绍
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。
二、算法步骤
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个"指针”,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾。如图所示:
三、代码以及测试
package com.rong.sort;
import java.util.Arrays;
public class MergeSortDemo {
public static void main(String[] args) {
int[] sourceArray = {4,21,13,1 ,7,15,9,26};
System.out.println("====================排序前====================");
for(int value:sourceArray) {
System.out.print(value + " ");
}
System.out.println();
System.out.println();
int[] sortArray = sort(sourceArray);
System.out.println("====================排序后====================");
for(int value:sortArray) {
System.out.print(value + " ");
}
System.out.println();
}
private static int[] sort(int[] sourceArray) {
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
if(arr.length<2) {
return arr;
}
int middle = (int) Math.floor(arr.length/2);
int[] left = Arrays.copyOfRange(arr, 0, middle);
int[] right = Arrays.copyOfRange(arr, middle, arr.length);
return merge(sort(left),sort(right));
}
private static int[] merge(int[] left, int[] right) {
int[] result = new int[left.length+right.length];
int i=0;
while(left.length>0 && right.length>0) {
if(left[0] <= right[0]) {
result[i++] = left[0];
left = Arrays.copyOfRange(left, 1, left.length);
}else {
result[i++] = right[0];
right = Arrays.copyOfRange(right, 1, right.length);
}
}
while(left.length > 0) {
result[i++] = left[0];
left = Arrays.copyOfRange(left, 1, left.length);
}
while(right.length > 0) {
result[i++] = right[0];
right = Arrays.copyOfRange(right, 1, right.length);
}
return result;
}
}
测试结果: