株式会社イーブ|未経験・転職の方も就職可能。Javaプログラマー育成のエキスパート

HOMEJAVA技術者育成システム開発求人情報個人情報保護

ソートアルゴリズム(8)

トップページ > Java技術者育成 > アルゴリズム > ソートアルゴリズム(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);
  }
}

[アルゴリズム]内の前後の記事
ソートアルゴリズム(9)
→ ソートアルゴリズム(8)
ソートアルゴリズム(7)


■更新日時での前後の記事
12月16日 お天気
→ ソートアルゴリズム(8)
12月15日 お天気