归并排序(转)
归并排序:是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(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);
- }
- }
- }