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