关于排序过程可参考如下链接:
https://www.bilibili.com/video/av18980178?from=search&seid=4156193334875693940
代码实现:
/*
1.建立一个堆(大顶堆或者小顶堆)
2.将该堆中第一个数字与最后一个数字交换,交换完成后执行第一步
3.执行第二步,直至该堆中数字排列有序
*/
public class heap {
//交换数组中的数字
public static void swap(int tree[], int i, int j){
int temp = tree[i];
tree[i] = tree[j];
tree[j] = temp;
}
//从i这个节点建立堆
public static void heapify(int tree[], int n, int i){
//结束递归
if(i >= n){
return;
}
int c1 = 2 * i + 1;
int c2 = 2 * i + 2;
int max = i;
if(c1 < n && tree[c1] > tree[max]){ //该判断建立的是大顶堆,将>改成<即为小顶堆
max = c1;
}
if(c2 < n && tree[c2] > tree[max]){
max = c2;
}
if(max != i){
swap(tree, max, i);
heapify(tree, n, max);
}
}
//建立大顶堆
public static void build_heap(int tree[], int n){
int last_node = n-1;
int parent = (last_node-1) / 2;
for(int i=parent; i>=0; i--){
heapify(tree, n, i);
}
}
//实现排序
public static void heap_sort(int tree[], int n){
build_heap(tree, n);
//相当于把最后一个节点删除
for(int i=n-1; i>0; i--){
swap(tree, i, 0);
heapify(tree, i, 0);
}
}
public static void main(String[] args) {
int tree[] = {2, 5, 3, 1, 10, 4};
heap_sort(tree, tree.length);
for (int i:
tree) {
System.out.print(i + "\t");
}
}
}