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

