Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 堆排序和通过最小堆排序_Java_Algorithm_Heapsort - Fatal编程技术网

Java 堆排序和通过最小堆排序

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

我知道如何使用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++ ){
      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在适当的位置实现时,它在插入阶段也是这样。我们为什么不构建一个最小堆并在其上执行一个冒泡搜索循环呢?这不会节省我们的时间吗?