堆排序强烈推荐这篇文章堆排序详解 - 前程明亮 - 博客园 !!
文中的堆排序用的是python实现的(循环遍历),我自己用JAVA实现了一下(循环,递归),特此记录。
为了方便阅读和使用,代码用了很多变量,看着略显繁琐,其实贼简单
核心思路:调整得到大顶堆,交换堆顶和堆底
核心数据结构:完全二叉树
核心操作:父节点和左右子节点的调整,得到大顶
核心函数:adjust,调整三元组,调整完后递归调整可能不满足父节点最大的三元组
核心代码其实不到十行
具体代码:
二叉树类
public class HeapSort {
void sort(int[] arr) {
int cur = arr.length - 1;
createBigHeap(arr);
while(cur > 0) {
swap(arr, cur--, 0);
adjust(arr, 0, cur);
}
}
void createBigHeap(int[] arr) {
for (int i = 0; i < (arr.length + 1) / 2; i++) {
adjust(arr, i, arr.length - 1);
}
}
void adjust(int[] arr, int i, int n) {
int lc = 2 * i + 1;
if (lc > n) return;
int rc = lc + 1;
if (rc > n) {
if (arr[lc] > arr[i]) {
swap(arr, lc, i);
if (i != 0) {
adjust(arr, (i -1)/2, n);
}
}
} else {
if (arr[i] >= arr[lc] && arr[i] >= arr[rc]) return;
if (arr[lc] > arr[rc]) {
swap(arr, lc, i);
if (i != 0) {
adjust(arr, (i -1)/2, n);
}
adjust(arr, lc, n);
} else {
swap(arr, rc, i);
if (i != 0) {
adjust(arr, (i -1)/2, n);
}
adjust(arr, rc, n);
}
}
}
void swap(int[] arr, int x, int y) {
int tmp = arr[y];
arr[y] = arr[x];
arr[x] = tmp;
}
}
2万+

被折叠的 条评论
为什么被折叠?



