堆的介绍
来源百度百科:
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。
堆排序是将数据看成是完全二叉树,根据完全二叉树的特性来进行排序的一种算法。
- 完全二叉树: 除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对齐。
- 满二叉树:除了叶子结点之外的每一个结点都有两个孩子,每一层(当然包含最后一层)都被完全填充。
- 完满二叉树:除了叶子结点之外的每一个结点都有两个孩子结点。
下面用图来说话:
- 完全二叉树(Complete Binary Tree):
- 满二叉树(Perfect Binary Tree):
- 完满二叉树(Full Binary Tree):
参考资料:
图解
代码
public class HeapDemo {
public static void main(String[] args) {
int arr[]= {36,5,69,6,8,-4,1};
for(int x:arr) {
System.out.print(x+",");
}
System.out.println();
headSort(arr);
for(int x:arr) {
System.out.print(x+",");
}
}
/**
* 堆排序
*/
public static void headSort(int[] arr) {
//构造初始堆,从第一个非叶子节点开始调整,左右孩子节点中较大的交换到父节点中
for (int i = (arr.length) / 2 - 1; i >= 0; i--) {
headAdjust(arr, arr.length, i);
}
//排序,将最大的节点放在堆尾,然后从根节点重新调整
for (int i = arr.length - 1; i >= 1; i--) {
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
headAdjust(arr, i, 0);
}
}
private static void headAdjust(int[] arr, int len, int i) {
int k = i, temp = arr[i], index = 2 * k + 1;
while (index < len) {
if (index + 1 < len) {
if (arr[index] < arr[index + 1]) {
index = index + 1;
}
}
if (arr[index] > temp) {
arr[k] = arr[index];
k = index;
index = 2 * k + 1;
} else {
break;
}
}
arr[k] = temp;
}
}
此文仅为个人笔记,理解有限,欢迎留言指正。