堆排序思想
对于给定的n个数据,初始时将n维数组看成一颗二叉树,若需要从小到大排序,将其调整为小顶堆(若从大到小排序,调整为大顶堆),输出堆顶元素,然后将堆的最后一个元素与堆顶元素(二叉树的根节点)互换,再接着将前n-1个元素(不包括最小数)重新调整为一个最小堆,再次交换堆顶与当前堆的最后一个元素,直到当前堆中只剩最后一个元素为止。程序的输出即为从小到大排序的数列。
Java实现
public class Main {
public static void main(String[] args) {
int[] a = {5,4,9,8,7,6,0,1,3,2};
int len = a.length;
MinHeapSort(a, len);
}
public static void adjustMinHeap(int[] a, int pos, int len){
int child, temp;
for(temp = a[pos]; (2*pos+1)<=len; pos = child){
child = 2*pos + 1;
if(child<len && a[child]>a[child+1]) // 有右子节点
child++;
if(a[child]<temp)
a[pos] = a[child];
else
break;
}
a[pos] = temp;
}
public static void MinHeapSort(int[] a, int len){
int i;
for(i=(len-1)/2;i>=0;i--) // 调整至小顶堆,从最后一个有孩子的结点开始往上调整
adjustMinHeap(a, i, len-1);
for(i=len-1;i>=0;i--){
System.out.println(a[0]);
swap(a, 0, i);
adjustMinHeap(a, 0, i-1); // 调整小顶堆
}
}
public static void swap(int[] a, int i, int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
输出
0
1
2
3
4
5
6
7
8
9