在给定范围内的堆

时间:2016-04-16 23:44:16

标签: java algorithm sorting heap heapsort

我正在尝试编写一个Heapsort方法,该方法仅在传递给方法的给定范围内执行排序。传入范围低和高,这些值对应于堆内的值,而不是堆的索引。例如,输入数组可能是:28 10 49 20 59 61 17如果低= 49且高= 61,则Heapsort之后的结果数组将如下所示:28 10 20 49 59 61 17.范围保持不变。我已经有一个工作的Heapsort方法,但我的问题是如何修改此方法以在传递的范围内排序?

public static void heapSort(int[] array, int low, int high)
    {        
        // Build a maxHeap
        for(int i = array.length / 2; i >= 0; i--)
        {
            percolateDown(array, i, array.length);
        }

        // Heap sort
        for(int i = array.length - 1; i > 0; i--)
        {
            swap(array, 0, i);
            percolateDown(array, 0, i);
        }
    }

正如您所看到的,我的方法接受低和高,但目前不对这些值做任何事情。我试过保留一个布尔标志来确定算法何时在范围内,并且仅在该布尔值为真时进行排序。但这没效果。如果有人能帮助我,我将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以创建仅包含给定范围内的值的新数组,然后仅使用新数组。然后替换原始数组的元素。

答案 1 :(得分:0)

public static void main( String [ ] args ) {
        Integer[] arr = {9, 8, 7, 6, 5, 4, 3, 2, 1};
        heapsort(arr, 0, 4);
}

/**
 * Standard heapsort.
 * @param a an array of Comparable items.
 */
public static <AnyType extends Comparable<? super AnyType>> void heapsort(AnyType [ ] a, int low, int high) {
    for (int i = high / 2; i >= low; i--)  /* buildHeap */
        percDown( a, i, high);
    for (int i = high; i > low; i--) {
        swapReferences(a, low, i);         /* deleteMax */
        percDown(a, low, i);
    }
    System.out.println(Arrays.toString(a));
}