Java 堆排序和通过最小堆排序
我知道如何使用heapsort和max heap属性对数组进行就地排序。Java 堆排序和通过最小堆排序,java,algorithm,heapsort,Java,Algorithm,Heapsort,我知道如何使用heapsort和max heap属性对数组进行就地排序。 但我想不出如何使用min-heap属性对其进行适当排序 我可以使用一个临时的中间数组,比如 public static int[] heapSort2(int[] array){ buildMinHeap(array); int [] temp = new int[array.length]; for(int i = 0; i < array.length; i++ ){ t
但我想不出如何使用min-heap属性对其进行适当排序 我可以使用一个临时的中间数组,比如
public static int[] heapSort2(int[] array){
buildMinHeap(array);
int [] temp = new int[array.length];
for(int i = 0; i < array.length; i++ ){
temp[i] = extractMin(array);
}
return temp;//returns array input sorted
}
公共静态int[]heapSort2(int[]array){
buildMinHeap(数组);
int[]temp=newint[array.length];
for(int i=0;i
但是我想不出一个不使用temp的方法。是可能的,还是最小堆仅用于优先级队列?使用最小堆进行就地排序与使用最大堆进行排序是对称的 假设您是按升序排序的,并且您有一个最大堆数组,根始终位于第一个元素(索引1),您执行一个排序步骤,将根移出到最后一个叶的位置(这是尚未排序的最右边的元素),使这个叶成为新根并将其放入堆中 然后使用最小堆数组按升序排序,将根始终放在最后一个元素(索引N)中,并将根移出最后一片叶子(这是尚未排序的最左边的元素),执行一个排序步骤,使这片叶子成为新的根,并将其放入堆中 在这样的堆中,获取父级、左级和右级子级索引的公式是不同的。在前一种情况下,假设指数1->N,方程为:
parent(i) = floor(i / 2)
leftchild(i) = 2 * i
rightchild(i) = 2 * i + 1
在后一种情况下,反向最小堆情况下,通过反向上述输入和输出处的指数获得方程式:
parent(i) = N + 1 - floor((N + 1 - i) / 2)
leftchild(i) = N + 1 - (2 * (N + 1 - i))
rightchild(i) = N + 1 - (2 * (N + 1 - i) + 1)
您可以看到,与前者相比,后者的方程式看起来很难看(但可以简化它们)。因此,当按升序排序时,最好只使用最大堆,而不是最小堆仅当您希望按降序排序时才使用最小堆-与按升序排序时使用最大堆的方向相同(第一个元素上的根)。经典堆排序通过将数组拆分为两部分进行排序,即已排序和未排序。在每一步中,它都会增加已排序的部分,减少未排序的部分。@bestsss:即插入sort@user384706当heapsort在适当的位置实现时,它在插入阶段也是这样。我们为什么不构建一个最小堆并在其上执行一个冒泡搜索循环呢?这不会节省我们的时间吗?