一、归并排序原理
归并排序(Merge Sort)是建立在归并操作上的一种有效、稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将“已有序的子序列”合并,得到完全有序的序列。将两个有序表合并成一个有序表,称为二路归并。
1.1 归并操作示例
对于数列{6,202,100,301,38,8,1},
初始状态为:6,202,100,301,38,8,1
第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
总的比较次数为:3+4+4=11;
逆序数为14。
1.2 归并操作算法步骤
第一步:申请空间(大小为两个已经排序序列之和),该空间用来存放合并后的序列。
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置。
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置。
重复步骤3,直到某一指针超出序列尾。
第四步:将“另一序列剩下的所有元素”直接复制到合并序列尾。
二、归并排序java实现
package com.mvp.test.sortway;
import java.util.Arrays;
/**
* 归并排序
*/
public class MergeSortTest {
public void sort(int[] array) {
if ((array == null) || (array.length <= 1)) {
return;
}
mergeSort(array, 0, array.length - 1);
}
// 归并排序
public void mergeSort(int[] array, int low, int high) {
if (low >= high) {
return;
}
// int middle = low + ((high - low) >> 1);
int middle = low + (high - low) / 2;
// 注意递归
mergeSort(array, low, middle);
mergeSort(array, middle + 1, high);
merge(array, low, middle, high);
}
public void merge(int[] array, int low, int middle, int high) {
int[] tempArray = new int[high - low + 1];
int left = low;
int right = middle + 1;
int index = 0;
while ((left <= middle) && (right <= high)) {
if (array[left] > array[right]) {
tempArray[index++] = array[right++];
} else {
tempArray[index++] = array[left++];
}
}
while (left <= middle) {
tempArray[index++] = array[left++];
}
while (right <= high) {
tempArray[index++] = array[right++];
}
for (int i = 0; i < tempArray.length; i++) {
array[i + low] = tempArray[i];
}
}
public static void main(String[] args) {
int[] array = {3, 5, 6, 2, 9, 8, 19, 12, 0};
MergeSortTest mergeSortTest = new MergeSortTest();
mergeSortTest.sort(array);
System.out.println(Arrays.toString(array));
}
}
运行结果如下:
[0, 2, 3, 5, 6, 8, 9, 12, 19]