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方法都有问题HeapSort返回错误的数组(Java),java,sorting,priority-queue,heapsort,max-heap,Java,Sorting,Priority Queue,Heapsort,Max Heap,我的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
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);
}
}
公共类堆
{
公共void maxHeap(int arr[],int index,int n)
{
int=指数;
n=阵列长度;
int l=(2*索引)+1;
int r=(2*指数)+2;
int size=arr.length;
如果((larr[max]))
{
最大=l;
}
其他的
{
最大=指数;
}
如果((r<尺寸)和&arr[r]>(arr[最大])
{
最大=r;
}
如果(最大!=索引)
{
int temp=arr[索引];
arr[指数]=arr[最大];
arr[最大]=温度;
最大堆(arr,最大,n);
}
}
public void buildMaxHeap(int arr[]
{
int n=阵列长度;
对于(整数索引=(n/2)-1;索引>=0;索引--)
{
maxHeap(arr,index,n);
}
}
公共无效排序(int-arr[])
{
int n=阵列长度;
buildMaxHeap(arr);
对于(int index=n-1;index>=0;index--)
{
int temp=arr[0];
arr[0]=arr[index];
arr[指数]=温度;
n=n-1;
maxHeap(arr,索引,0);
}
}
公共void打印数组(int arr[])
{
int n=阵列长度;
对于(int i=0;i如果我正确理解了maxHeap
方法,那么n
参数应该是最大索引。也就是说,maxHeap(arr,index,n)
应该在arr[index]
处获取项目并将其向下推到堆中,但不要超过arr[n]
如果这是真的,那么您的错误在maxHeap
方法的第二行:
n = arr.length;
maxHeap(arr, index, 0);
您正在覆盖传递的n
参数的值
在sort
方法中有此调用:
n = arr.length;
maxHeap(arr, index, 0);
因此,您告诉maxHeap
将arr[index]
处的项目向下推,但不要低于arr[0]
。在我看来,这将是一个问题,因为任何东西都不会移动
你需要花一点时间仔细检查你的代码。使用调试器单步执行是一个很大的帮助。如果你不知道如何使用调试器,现在是学习的最佳时机。我注释掉了这行代码,它对输出没有影响。我实际上决定将排序后的数组打印到控制台,看看它是否在descendi中ng顺序,但我得到的结果是15,11,9,6,7,5
,而不是15,11,9,7,6,5
。出于某种原因,sort
方法跳过了按正确顺序对7和6进行排序。@JamieL。请参阅我更新的答案。这次调用maxHeap
时出现了另一个错误。