public class Sort {
//数组申请过大,会出java.lang.OutOfMemoryError
int[] a = {10, 1, 35, 61, 89, 36, 55};
//输出数组
void showArr(int[] a) {
for (int i = 0; i < a.length; i++) {
System.out.printf("%d ", a[i]);
}
System.out.println();
}
//交换函数
void swap(int[] a, int i, int j) {
int t;
t = a[i];
a[i] = a[j];
a[j] = t;
}
/*
堆排序
一种选择排序
大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
步骤:
1. 创建一个堆h[0...n-1]
2. 把堆首(最大值)和堆尾交换
3, 把堆尺寸缩小1
4. 重复步骤,直到堆的大小为1
*/
//全局变量,记录当前堆的长度
int len;
//建立大顶堆
void buildMaxHeap(int[] a) {
//初始化len
len = a.length;
//length/2-1正好是完全二叉树最后一个结点的父节点,前提是数组下标为0
for (int i = a.length/ 2-1; i >= 0; i--) {
//自下而上,使每个非叶子结点都是大顶堆
heapify(a, i);
}
}
//调整从第i个结点为父节点的完全二叉树为大顶堆
void heapify(int[] a, int i) {
int left = 2 * i + 1;
int right = 2 * i + 2;
int largest = i;
if (left < len && a[left] > a[largest])
largest = left;
if (right < len && a[right] > a[largest])
largest = right;
if (largest != i) {
swap(a, i, largest);
heapify(a, largest);
}
}
void HeapSort(int[] a) {
buildMaxHeap(a);
for (int i = a.length - 1; i > 0; i--) {
//把当前最大值放到数组最后
swap(a, 0, i);
//减小数组长度
len--;
//调整交换后的堆
heapify(a, 0);
}
}
public static void main(String[] args) {
Sort sort = new Sort();
sort.HeapSort(sort.a);
sort.showArr(sort.a);
}
}
堆排序(Java)
最新推荐文章于 2024-08-11 10:39:52 发布