株式会社イーヴ

EeBlog(テクニカルブログ)

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

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

今回はクイックソートを紹介します。

クイックソートの基本的な考え方は、まずピボットと呼ばれる基準値を設定し、リストの要素をピボットの値以下の値と、より大きい値に分けます。そしてピボットをそのリストの中心の値とします。そして、2つに分けた部分リストのそれぞれに対して再帰的にクイックソートを適用することでソートします。

以下は Java でのクイックソートの実装例です。

sort/QuickSort.java

package sort;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class QuickSort {
  public static <E extends Comparable<E>> void sort(List<E> list) {
    if (list.size() < 2) {
      return;
    }
    E pivot = list.get(0);
    int start = 1, last = list.size() - 1;
    while (start <= last) {
      while (start <= last) {
        if (list.get(start).compareTo(pivot) > 0) {
          break;
        }
        start++;
      }
      while (start <= last) {
        if (list.get(last).compareTo(pivot) <= 0) {
          break;
        }
        last--;
      }
      if (start <= last) {
        Collections.swap(list, start, last);
      }
    }
    Collections.swap(list, 0, start - 1);
    sort(list.subList(0, start -1));
    sort(list.subList(start, list.size()));
  }

  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("before: " + list.toString());
    sort(list);
    System.out.println("after : " + list.toString());
  }
}