简介
这里就是自己记录一下,因为确实已经有了很多的关于堆排序的blog的分享了,所以我就不再造轮子了。
但是给大家推荐一个非常好的讲解:
然后就是我自己记录一下我的代码了,Java实现的大根堆,得到的是升序排列
import org.junit.Test;
/**
* @Author: Braylon
* @Date: 2020/2/29 20:56
* @Description: 大根堆
*/
public class Heap {
/**
*
* @param arr
* @param pos pos要调整的位置
* @param scale 要调整的节点的数量
*/
public void adjustHeap(int[] arr, int pos, int scale) {
Integer tmp = arr[pos];
//找到左孩子节点索引
int left = 2 * pos + 1;
while (left < scale) {
if (left + 1 < scale && arr[left] < arr[left + 1]) {
left = left + 1;
}
if (arr[pos] < arr[left]) {
arr[pos] = arr[left];
pos = left;
left = 2 * pos + 1;
} else {
break;
}
arr[pos] = tmp;
}
}
public void buildHeap(int[] arr) {
int pos = (arr.length - 1) / 2;
for (int i = pos; i >= 0; i--) {
adjustHeap(arr, i, arr.length);
}
}
public void sort(int[] arr) {
Integer tmp;
buildHeap(arr);
for (int i = 0; i < arr.length; i++) {
tmp = arr[0];
arr[0] = arr[arr.length - i - 1];
arr[arr.length - i - 1] = tmp;
adjustHeap(arr, 0, arr.length - i - 1);
}
}
@Test
public void test() {
int[] arr = {1, 3, 6, 8, 2, 2, 45, 56, 122, 67, 2, 43};
sort(arr);
for (int i : arr) {
System.out.println(i);
}
}
}
只是记录一下,
大家共勉~~