ソートアルゴリズム(8)
今回はストランドソートを解説します。
ストランドソートは前回解説したマージソートと同じマージ系と呼ばれるソートアルゴリズムです。
マージソートではソートされていないリストを2分割してマージソートを再帰呼び出しして、ソートされたサブリストをマージするアルゴリズムでした。
ストランドソートでは、リストからソートされたサブリストを抽出し、結果リストにマージしていくことでソートします。
sort/StrandSort.java
package sort;
import java.util.List;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Collections;
public class StrandSort {
private static <E extends Comparable<E>> List<E> merge(List<E> list1,
    List<E> list2) 
    ListIterator<E> iter1 = list1.listIterator();
    ListIterator<E> iter2 = list2.listIterator();
    List<E> result = new LinkedList<E>();
    if (!iter1.hasNext()) {
      return list2;
    }
    if (!iter2.hasNext()) {
      return list1;
    }
    E item1 = iter1.next();
    E item2 = iter2.next();
    for (;;) {
      if (item1.compareTo(item2) < 0) {
         result.add(item1);
         if (iter1.hasNext()) {
           item1 = iter1.next();
         } else {
           result.add(item2);
           while (iter2.hasNext()) {
             result.add(iter2.next());
           }
           break;
         }
      } else {
        result.add(item2);
        if (iter2.hasNext()) {
        item2 = iter2.next();
        } else {
          result.add(item1);
          while (iter1.hasNext()) {
            result.add(iter1.next());
          }
          break;
        }
      }
    }
    return result;
  }
  private static <E extends Comparable <E>> List<E> subList(List<E> list) {
    ListIterator<E> iter = list.listIterator();
    if (!iter.hasNext()) {
      return Collections.<E>emptyList();
    }
    List<E> result = new LinkedList<E>();
    E max = iter.next();
    iter.remove();
    result.add(max);
    while (iter.hasNext()) {
      E tmp = iter.next();
      if (tmp.compareTo(max) > 0) {
        iter.remove();
        result.add(max = tmp);
      }
    }
    return result;
  }
  public static <E extends Comparable<E>>  List<E> sort(List<E> list) {
    List<E> result = new LinkedList<E>();
    while (!list.isEmpty()) {
      result = merge(result, subList(list));
    }
    return result;
  }
  public static void main(String args[]) {
    List<Integer> list = new LinkedList<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);
  }
}
 
		
