HeapSort返回错误的数组(Java)

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

我的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);
}      
}
公共类堆
{
公共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
时出现了另一个错误。