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