【算法设计与分析基础】13、合并排序

package cn.xf.algorithm.ch04;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.junit.Test;

public class MergeSort {

	public void mSort(List<Integer> data) {
		if(data.size() <= 1) {
			return;
		}
		
		//拷贝两边的数据
		List copyA = new ArrayList();
		List copyB = new ArrayList();
		for(int i = 0; i < data.size() / 2; ++i) {
			copyA.add(data.get(i));
		}
		for(int j = data.size() / 2; j < data.size(); ++j) {
			copyB.add(data.get(j));
		}
		//递归排序子集
		mSort(copyA);
		mSort(copyB);
		//排序结束之后,放回data中
		Merge(copyA, copyB, data);
	}
	
	/**
	 * 合并两个子集
	 * @param dataA
	 * @param dataB
	 * @param data
	 */
	public void Merge(List<Integer> dataA, List<Integer> dataB, List data) {
		//分别遍历A,B,DATA
		int i = 0, j = 0, k = 0;
		
		while(i < dataA.size() && j < dataB.size()) {
			//遍历两边数据
			if(dataA.get(i) <= dataB.get(j)) {
				//吧A放进去
				data.set(k, dataA.get(i++));
			} else {
				data.set(k, dataB.get(j++));
			}
			k += 1;
		}
		
		if(i >= dataA.size()) {
			//如果第一个到最后了,那么把B后面的拷贝进去
			for(; j < dataB.size(); ++j) {
				data.set(k++, dataB.get(j));
			}
		} else {
			for(; i < dataA.size(); ++i) {
				data.set(k++, dataA.get(i));
			}
		}
	}
	
	@Test
	public void test1() {
		List<Integer> data = Arrays.asList(8,3,2,9,7,1,5,4);
		//进行排序
		MergeSort ms = new MergeSort();
		ms.mSort(data);
		for(int i : data) {
			System.out.print(i + " ");
		}
	}
}

  

 

结果:

 

 

posted @ 2017-06-05 22:37  cutter_point  阅读(168)  评论(0编辑  收藏  举报