前置知识:
我们的一个最大最小堆可以构成一个数组。以最大堆为例。
当前节点下标是i,那么可以知道
父节点:parent = (i - 1)/ 2
左孩子:left = 2 * i + 1
右孩子:right = 2 * i + 2
//直接看代码吧
package data_strust;
/**
* 堆排序
*/
public class Heap_sort {
public static void heapify(int tree[] , int i , int n){
if(i >= n) return ;
//比较左孩子还有右孩子,找到最大值,然后和最大值交换
int max = i; //这个用来记录下 当前节点和左右孩子节点最大值的下标,初始为i
int left = 2 * i + 1;
int right = 2 * i + 2;
int tran = 0;
//左孩子的大于当前节点
if(left < n && tree[left] > tree[max]) max = left;
//右孩子大于那个最大值
if(right < n && tree[right] > tree[max]) max = right;
if(max == i) return ;
//然后交换值
swap(tree , i , max);
//然后将max 位置进行heapify
heapify(tree , max , n);
}
/**
* 思路: 从最后的一个节点的父节点开始进行headify操作,直到根节点。
* @param tree
* @param n
*/
public static void build_heap(int tree[] , int n){
//先找到最后一个节点的父节点
if(n == 1) return ;
int parent = (n - 2) / 2;
for(int node = parent; node >= 0; node--){
heapify(tree , node , n);
}
return ;
}
/**
* 思路:首先交换堆顶和最后一个叶子节点。
* @param tree
* @param n
*/
public static void get_heapTop(int tree[] , int n){
swap(tree , 0 , n-1);
//然后heapify堆顶就可以
heapify(tree , 0 , n);
}
/**
* 思路: 首先将数据插入到最后面,然后进行重构二叉树
* @param tree
* @param n
* @param data
*/
public static void insert_heap(int tree[] , int n , int data){
tree[n] = data;
n ++;
build_heap(tree , n);
}
public static void swap(int tree[] , int i , int j){
int temp = tree[i];
tree[i] = tree[j];
tree[j] = temp;
}
}