• 【算法设计与分析基础】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 + " ");
    		}
    	}
    }
    

      

    结果:

  • 相关阅读:
    随笔
    json对象的默认排序问题
    SQl死锁随想
    疑惑
    .netportal
    WCF中出现方法出现无法匹配的异常
    自动播放图片,可以调整速度。
    一个二级树形菜单,初始显示为全部展开,适用于分类较少的情况。
    整理了一下以后需要用的软件
    缩略图,大图,同页显示
  • 原文地址:https://www.cnblogs.com/cutter-point/p/6947448.html
Copyright © 2020-2023  润新知