归并排序这个玩意确实把我折磨的不轻,一直以来对递归有一点点阴影,应该是刚开始学习写代码的时候就被递归折磨过。
什么是归并排序?
顾名思义,归并,就是把两个东西结合起来。在这里,指的是把两个已经排好序的集合合并成一个大数据集。
下面的实现,使用的是递归实现方式。也就是把一个大串一分为二为两个子串,子串再用递归的方式分成更小的子串,直到每一个子串只包含一个元素,这时使用插入排序,把两个子串进行排序。
package sorter;
/**
* 归并排序
*/
public class Merge {
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);
}
}
}
归并排序算法复杂度为O(n),但在实现过程中需要申请一些临时数组来存放子串。
嗯,暂时理解这么多,明天再看下归并排序的细分