归并排序

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

}

相关推荐