刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!
解答思路:
堆排序是一种基于二叉堆的比较排序算法。首先,将待排序的数组构建成一个大顶堆(每个节点的值都大于或等于其子节点的值),然后交换堆顶元素(最大值)和最后一个元素,此时数组的最大值已经在正确的位置上。接着将剩余的元素重新构建成一个大顶堆,重复此过程直到整个数组排序完成。
最优回答:
以下是使用Java实现堆排序的代码示例:
public class HeapSort {
public void sort(int arr[]) {
int n = arr.length;
// 构建大顶堆
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(arr, n, i);
}
// 从堆顶开始提取元素并重新构建堆
for (int i = n - 1; i >= 0; i--) {
// 将最大元素交换到数组末尾
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
// 重新构建大顶堆,但此次只处理剩余的元素
heapify(arr, i, 0);
}
}
// 用于构建大顶堆的辅助函数
void heapify(int arr[], int n, int i) {
int largest = i; // 初始化最大值为当前节点i的值
int leftChild = 2 * i + 1; // 左子节点的索引
int rightChild = 2 * i + 2; // 右子节点的索引
if (leftChild < n && arr[leftChild] > arr[largest]) { // 如果左子节点大于当前节点,更新最大值索引为左子节点索引
largest = leftChild;
}
if (rightChild < n && arr[rightChild] > arr[largest]) { // 如果右子节点大于当前最大值,更新最大值索引为右子节点索引
largest = rightChild;
}
if (largest != i) { // 如果最大值的索引不是当前节点,则交换两个节点值并递归调整子树结构以保持大顶堆的特性
int swap = arr[i];
arr[i] = arr[largest];
arr[largest] = swap;
heapify(arr, n, largest); // 递归调整子树结构以保持大顶堆的特性
}
}
}
本文链接:请编写一段Java代码,实现堆排序算法,并简要描述其排序过程。
版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!