HeapSort
what
sorting using the features of MaxHeap or MinHeap(from which you can get the max or min value from the root node of the heap)
排序过程process of the sorting
- 首先构建最大(小)堆,
- 堆首和堆尾互换
- 堆的尺寸缩小1, 调到用shift_down(0), 把新的数组顶端数据调整到响应的位置。
- 重复2,直到堆尺寸为1.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20/**
* 堆排序,先构造一个大顶堆或者小顶堆,利用构造堆,每次找到当前子数组中最大或者最小的值,完成排序
*
* */
public int[] sort(int[] sourceArray) {
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
int len = arr.length;
buildMaxHeap(arr, len);
System.out.println(Arrays.toString(arr));
for (int i = len - 1; i > 0; i--) {
swap(arr, 0, i);
len--;
// System.out.println(Arrays.toString(arr));
heapify(arr, 0, len);
}
return arr;
}
构建堆原理与方法
利用堆的特性,数组中元素下标i,可以找到它的左右子节点的下标为i * 2 + 1 和 i * 2 + 2。
从数组的中间索引开始,递减的顺序,计算找到左右子节点的位置,然后对比节点大小,转换成符合条件的状态(大顶堆,就让左右节点中最大的值替换为当前节点,小顶堆相反)。如果发生了替换,就递归向下将替换下去的这个节点再对比左右节点做这个堆化的操作。 因为这个堆化的过程顺序是从初始数组的中间索引开始的,也就是其左右子树已经是最底层的叶子节点。所以按照这个顺序来堆化,就保证了整棵树可以完全的堆化成符合条件(大顶堆,左右子节点小于当前节点,小顶堆相反)的样子。
1 | /** |
- Post title:HeapSort
- Post author:郭旭升
- Create time:2023-01-31 18:02:00
- Post link:2023/01/31/堆排序算法/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
Comments