java - HeapSort 返回错误的数组(Java)
问题描述
我的 HeapSort 返回一个顺序不正确的数组。我的原始数组是 {15, 9, 11, 5, 6, 7},当运行 heapSort 方法时,我得到这个数组:{15, 11, 9, 6, 7, 5}。
我打印了该方法以查看 maxHeap 做了什么并得到了:{15, 9, 11, 5, 6, 7},当映射到二叉树中时,它实际上是一个 maxHeap。这让我相信排序方法或 buildMaxHeap 方法有问题。
public class heaps
{
public void maxHeap(int arr[], int index, int n)
{
int largest = index;
n = arr.length;
int l = (2*index) + 1;
int r =(2*index) + 2;
int size = arr.length;
if ((l < n) && (arr[l] > arr[largest]))
{
largest = l;
}
else
{
largest = index;
}
if ((r < size) && arr[r] > (arr[largest]))
{
largest = r;
}
if (largest != index)
{
int temp = arr[index];
arr[index] = arr[largest];
arr[largest] = temp;
maxHeap(arr, largest, n);
}
}
public void buildMaxHeap(int arr[])
{
int n = arr.length;
for (int index = (n / 2) - 1; index >= 0; index--)
{
maxHeap(arr, index, n);
}
}
public void sort(int arr[])
{
int n = arr.length;
buildMaxHeap(arr);
for (int index = n - 1; index >= 0; index--)
{
int temp = arr[0];
arr[0] = arr[index];
arr[index] = temp;
n = n - 1;
maxHeap(arr, index, 0);
}
}
public void printArray(int arr[])
{
int n = arr.length;
for (int i=0; i<n; ++i)
System.out.print(arr[i]+" ");
System.out.println();
}
public static void main(String[] args)
{
heaps o = new heaps();
int array[] = {15, 9, 11, 5, 6, 7};
heaps.sort(array);
heaps.printArray(array);
heaps.maxHeap(array, 0, array.length);
heaps.printArray(array);
}
}
解决方案
如果我正确理解您的maxHeap
方法,则该n
参数应该是最大索引。也就是说,maxHeap(arr, index, n)
应该在 处取项目arr[index]
并将其推下堆,但不超过arr[n]
.
如果这是真的,那么你的错误就在你的maxHeap
方法的第二行:
n = arr.length;
您正在覆盖n
您传递的参数的值。
您的sort
方法中有此调用:
maxHeap(arr, index, 0);
因此,您要告诉maxHeap
将项目arr[index]
向下推,但不能低于arr[0]
. 在我看来,这将是一个问题,因为什么都不会动。
您需要花一点时间仔细检查您的代码。使用调试器单步执行是一个很大的帮助。如果您不知道如何使用调试器,那么现在是学习的最佳时机。
推荐阅读
- wix - Wix 安装后和卸载前可执行文件
- javascript - 去抖内部的开关盒内部的正则表达式不起作用
- sql - 时间戳间隔上的 Postgres 语法错误
- apache-spark - 组合(不是 sql 连接)2 个 spark 数据帧
- openssl - EVP_EncryptUpdate 缺少 4 个字节
- kotlin - Freemarker 为“TheApp”对象提供未解决的参考
- javascript - 在主函数中运行 2 个函数
- html - 当我将导航栏固定到 CSS 中的视口/网页顶部时,我无法滚动通过导航栏
- python - 过滤最大日期小于另一个日期
- django - 条件下需要 Django 表单字段