株式会社イーヴ

EeBlog(テクニカルブログ)

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

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

今回はヒープソートを紹介します。
ヒープソートとはその名のとおり、ヒープ構造を用いてソートを行うアルゴリズムです。
ヒープ構造とは2分木構造の一種で、ルートが常にそのヒープ構造の中の最大値(あるいは最小値)を指すように調整を行うデータ構造です。
このヒープ構造にソートを行いたいデータを追加していき、次にルートからデータを取り出して順番に並べていきます。

sort/HeapSort.java

package sort;

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

 public class HeapSort {

   private static <E extends Comparable<E>> void swap(List<E> list, int a, int b) {
     E tmp = list.get(a);
     list.set(a, list.get(b));
     list.set(b, tmp);
   }

   private static <E extends Comparable<E>> void insertHeap(List<E> list, int i) {
     for (int j = (i - 1) / 2; i > 0; i = j, j = (i - 1) / 2) {
       if (list.get(i).compareTo(list.get(j)) > 0) {
     swap(list, i, j);
       } else {
     return;
       }
     }
   }

   private static <E extends Comparable<E>> void deleteHeap(List<E> list, int i) {
     swap(list, 0, i--);
     int k;
     for (int j = 0; j < i; j = k) {
       int l = j * 2 + 1;
       int r = l + 1;
       if (l > i) {
     return;
       }
       k = l;
       if (l < i) {
     k = (list.get(l).compareTo(list.get(r)) > 0) ? l : r;
       }
       swap(list, j, k);
     }
     insertHeap(list, i);
   }

   public static <E extends Comparable<E>> void sort(List<E> list) {
     for (int i = 1; i < list.size(); i++) {
       insertHeap(list, i);
     }
     for (int i = list.size() - 1; i >= 1; i--) {
       deleteHeap(list, i);
     }
   }

   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);
     sort(list);
     System.out.println(list);
   }
 }