株式会社イーヴ

EeBlog(テクニカルブログ)

TOP > EeBlog > ソートアルゴリズム(7)

ソートアルゴリズム(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);
  }
}