归并排序:是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
排序基本思想是:
将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素,将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素,重复步骤2,直到所有元素排序完毕
速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列
归并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组
稳定 时间复杂度O(nlogn) n大时较好
public class MergeSort {
/**
* 静态方法功能:给一个给定的数组用归并排序法排序
* @param a:待排序数组
* @param begin:开始下标
* @param end:终止下标
*/
public static void mergeSort(int a[], int begin, int end)
{
if (begin < end)
{
int a1[] = new int[end - begin + 1];
int begin0 = 0;
int mid = (begin + end) / 2;
mergeSort(a, begin, mid);
mergeSort(a, mid + 1, end);
int begin1 = begin;
int begin2 = mid + 1;
int end1 = mid;
int end2 = end;
for (int i = 0; i < a1.length; i++)
{
if (begin1 <= end1 && begin2 <= end2)
{
if (a[begin1] < a[begin2])
{
a1[begin0] = a[begin1];
begin0++;
begin1++;
}
else
{
a1[begin0] = a[begin2];
begin0++;
begin2++;
}
}
else
break;
}
if (begin1 <= end1)
{
for (; begin0 < a1.length; begin0++)
{
a1[begin0] = a[begin1];
begin1++;
}
}
else
{
for (; begin0 < a1.length; begin0++)
{
a1[begin0] = a[begin2];
begin2++;
}
}
// 将排好序的结果填回原数组
for (int i = 0; i < a1.length; i++)
{
a[begin + i] = a1[i];
}
}
}
public static void main(String[] args) throws Exception {
int[] a = { 49, 38, 65, 97, 76, 13, 27, 49 };
mergeSort(a, 0, a.length - 1);
for (int key : a) {
System.out.format(" %d", key);
}
}
}