归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。二路归并排序是一种稳定的算法。其时间复杂度为O(logn)。
归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
/**
* 归并排序算法
*/
package sort;
import java.util.Arrays;
/**
* @author 16026
*
*/
public class MergerSort {
private static void sort(int[] array, int start, int end) {
if (start >= end)
return;
int mid = (start + end) >> 1;
// 递归实现归并排序
sort(array, start, mid);
sort(array, mid + 1, end);
mergerSort(array, start, mid, end);
}
// 将两个有序序列归并为一个有序序列(二路归并)
private static void mergerSort(int[] array, int start, int mid, int end) {
// TODO Auto-generated method stub
int[] arr = new int[end + 1]; // 定义一个临时数组,用来存储排序后的结果
int low = start; // 临时数组的索引
int left = start;
int center = mid + 1;
// 取出最小值放入临时数组中
while (start <= mid && center <= end) {
arr[low++] = array[start] > array[center] ? array[center++] : array[start++];
}
// 若还有段序列不为空,则将其加入临时数组末尾
while (start <= mid) {
arr[low++] = array[start++];
}
while (center <= end) {
arr[low++] = array[center++];
}
// 将临时数组中的值copy到原数组中
for (int i = left; i <= end; i++) {
array[i] = arr[i];
}
}
public static void main(String[] args) {
int[] array = { 58, 48, 69, 87, 49, 59, 25, 35, 68, 48 };
sort(array, 0, array.length - 1);
System.out.println(Arrays.toString(array));
}
}
运行结果如下: