码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-06-06 01:03:11      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:print   ima   遍历   copy   com   get   第一个   lis   data   

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 + " ");
		}
	}
}

  

 

结果:

 

技术分享

 

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

标签:print   ima   遍历   copy   com   get   第一个   lis   data   

原文地址:http://www.cnblogs.com/cutter-point/p/6947448.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!