一个无序集合,用归并排序,
1、拆成两半:把集合对半分成两个集合,递归不断拆分
2、递归分到最后两个元素,跳出递归
3、跳出递归后,把分开的两个集合合并(每个集合已经排好序,遍历一次按序比较即可)
基本思想实现,并未考虑性能:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Integer> result = sortByMergeAlgo(Arrays.asList(5, 3, 5, 4, 2, 5));
System.out.println(result);
}
public static List<Integer> sortByMergeAlgo(List<Integer> rawList) {
int size = rawList.size();
if (size < 2) {
return rawList;
}
if (size == 2) {
if (rawList.get(0).compareTo(rawList.get(1)) > 0) {
Integer t = rawList.get(1);
rawList.set(1, rawList.get(0));
rawList.set(0, t);
}
return rawList;
}
//size > 2
List<Integer> first = new ArrayList<>(rawList.subList(0, size / 2));
List<Integer> later = new ArrayList<>(rawList.subList(size / 2, size));
first = sortByMergeAlgo(first);
later = sortByMergeAlgo(later);
List<Integer> mergeList = mergeAlgo(first, later);
return mergeList;
}
public static List<Integer> mergeAlgo(List<Integer> first, List<Integer> later) {
List<Integer> list = new ArrayList<>();
int i = 0;
int j = 0;
while (i < first.size() && j < later.size()) {
Integer a = first.get(i);
Integer b = later.get(j);
if (a.compareTo(b) < 0) {
list.add(a);
i++;
} else {
list.add(b);
j++;
}
}
if (i < first.size()) {
list.addAll(first.subList(i, first.size()));
} else if (j < later.size()) {
list.addAll(later.subList(j, later.size()));
}
return list;
}
}