ソートアルゴリズム(7)
今回はマージソートです。
マージソートの処理は
1.ソートするリストを2つに分ける
2.分けたリストをソートする
3.2つのリストをマージする
の3つの処理を再帰的に行うことでソートします。
1. のソートするリストの要素が0か1の場合にはソートする必要が無いのでリストをそのまま返します。これにより処理2で無限再帰しないことが保障されます。
2. の分けたリストをソートする部分でマージソートを再帰呼び出しします。
3. のマージでは2つのリストのそれぞれの先頭の値を比較し小さい(または大きい)方の値を取り出して結果のリストに追加します。
sort/MergeSort.java
package sort;
import java.util.List; import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Collections;
public class MergeSort {
private static <E extends Comparable<E>> List<E> merge(List<E> lhs, List<E> rhs) {
List<E> list = new LinkedList<E>();
int lidx = 0, ridx = 0;
while (true) {
if (lidx >= lhs.size()) {
list.addAll(rhs.subList(ridx, rhs.size()));
return list;
}
if (ridx >= rhs.size()) {
list.addAll(lhs.subList(lidx, lhs.size()));
return list;
}
E l = lhs.get(lidx);
E r = rhs.get(ridx);
if (l.compareTo(r) < 0) {
list.add(l);
lidx++;
} else {
list.add(r);
ridx++;
}
}
}
public static <E extends Comparable<E>> List<E> sort(List<E> list) {
if (list.size() < 2) {
return list;
}
List<E> lhs = list.subList(0, list.size()/2);
List<E> rhs = list.subList(list.size()/2, list.size());
return merge(sort(lhs), sort(rhs));
}
public static void main(String args[]) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 10; i++) {
list.add(i);
}
Collections.shuffle(list);
System.out.println(list);
list = sort(list);
System.out.println(list);
}
}

