每天学一点算法-归并排序算法

归并排序算法


定义


归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。


步骤


1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

2.  设定两个指针,最初位置分别为两个已经排序序列的起始位置

3.  比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

4.  重复步骤 3 直到某一指针达到序列尾

5.  将另一序列剩下的所有元素直接复制到合并序列尾


时间复杂度


O(nlogn)


代码


package com.sprd.test.algorithm;

/**
 * Copyright 2014 TJ SPREADTRUM TEST_AF All Right Reserved
 * 
 * @author: hui.qian Created on 2014年11月27日 上午9:09:13 Description:
 */
public class Mergesort {

	public int[] sort(int[] a, int[] b) {
		int[] merge = new int[a.length + b.length];
		int indexA = 0;
		int indexB = 0;
		int i = 0;
		while (indexA < a.length && indexB < b.length) {
			if (a[indexA] <= b[indexB]) {
				merge[i++] = a[indexA++];
			} else {
				merge[i++] = b[indexB++];
			}
		}
		if (indexA == a.length) {
			for (int j = indexB; indexB < b.length; indexB++) {
				merge[i++] = b[indexB];
			}
		} else {
			for (int j = indexA; indexA < a.length; indexA++) {
				merge[i++] = b[indexA];
			}
		}
		return merge;
	}

	public static void main(String[] args) {
		int[] sortA = { 1, 3, 5, 7, 9 };
		int[] sortB = { 2, 4, 6, 8, 10 };
		Mergesort sorter = new Mergesort();
		long start = System.currentTimeMillis();
		int[] sorted = sorter.sort(sortA, sortB);
		long end = System.currentTimeMillis();
		System.out.println("耗时 : " + (end - start));
		System.out.println("排序前 : ");
		print(sortA);
		print(sortB);
		System.out.println("排序后 : ");
		print(sorted);
	}

	public static void print(int[] datas) {
		for (int i = 0; i < datas.length; i++) {
			System.out.print(datas[i] + " ");
		}
		System.out.println("");
	}
}

输出


耗时 : 0
排序前 : 
1 3 5 7 9 
2 4 6 8 10 
排序后 : 
1 2 3 4 5 6 7 8 9 10 


你可能感兴趣的:(算法)