实施heapsort的正确方法是什么?

时间:2015-02-15 02:23:41

标签: java algorithm heapsort

我花了最多5个小时看了很多视频和阅读材料(包括了cormen),我终于决定编写自己的heapsort来测试它。我基本上从标准输入中获取一些输入并将它们存储在一个数组中,然后我将使用heapsort对它们进行排序。

以下是我的代码

 public static void buildHeap(int[] A)
     {
         n = A.length - 1;
         for(int i = n/2; i>0; i--)
         {
             maxHeapify(A,i);
         }
     }

     public static void maxHeapify(int[] A, int i)
     {
         int left = 2*i;
         int right = 2*i + 1;
         int largest = 0;
         if(left <= n && A[left] > A[i])
            {
                largest=left;
            }
            else
            {
                largest=i;
            }

            if(right <= n && A[right] > A[largest]){
                largest=right;
            }
            if(largest!=i){
                int temp = A[i];
                A[i] = A[largest];
                A[largest] = temp;
                maxHeapify(A, largest);
            }
        }
  

我的数组输入为:3,5,8,7,1,13,11,15,6输出为:   3,15,13,​​11,6,8,5,7,1

输出显然是错误的,因为第一个索引应包含最高值15.

然后我决定采取笔和笔记本的良好旧路线并跟踪代码并意识到在buildHeap中我应该是n-1/2。但它也没有给我正确的输出。我现在真的迷路了,很沮丧。任何人都能明白我做错了什么吗?

1 个答案:

答案 0 :(得分:2)

您的索引计算已关闭:

int left = 2*i;
int right = 2*i + 1;

如果i为0,那么我们希望leftright为1和2.如果i为1,则left和{{ 1}}应为3和4,依此类推。计算应该是:

right

此外,

int left = 2*i + 1;
int right = 2*i + 2;

条件是for(int i = n/2; i>0; i--) 。循环体仅在i > 0时运行,因此索引0处的元素(即第一个)将不会被移动。条件应为i > 0