Java 我可以创建堆,但数组的第一个元素未被触及
HeapSort.java:Java 我可以创建堆,但数组的第一个元素未被触及,java,sorting,heap,heapsort,Java,Sorting,Heap,Heapsort,HeapSort.java: public class HeapSort{ public static void run(int[] array, int size){ heapify(array, size, 1); } private static void heapify(int[] array, int size, int v){ if (v*2>=size){ return;
public class HeapSort{
public static void run(int[] array, int size){
heapify(array, size, 1);
}
private static void heapify(int[] array, int size, int v){
if (v*2>=size){
return;
}
heapify(array, size, v*2);
heapify(array, size, v*2+1);
fixHeap(array, size, v);
}
private static void fixHeap(int[] array, int size, int v){
if (v*2>=size){
return;
}
int u = 0;
if (array[v*2]>array[(v*2)+1]){
u = v*2;
} else{
u = (v*2)+1;
}
if (array[u]>array[v]){
int temp = array[u];
array[u] = array[v];
array[v] = temp;
fixHeap(array, size, u);
}
}
}
Main.java:
import java.util.Random;
public class Main{
public static void main(String args[]){
Main m = new Main();
m.run();
}
private void run(){
int size = 8;
int[] array = new int[size];
this.randomArray(array,size);
System.out.println("");
HeapSort.run(array,size);
this.printArray(array, size);
System.out.println("");
}
private void randomArray(int[] array, int size){
Random r = new Random();
int el = 0;
for(int i=0; i<size; ++i){
el = r.nextInt(50);
array[i] = el;
System.out.print(array[i] + " ");
}
}
private void printArray(int[] array, int size){
for(int i=0; i<size; ++i){
System.out.print(array[i] + " ");
}
}
}
或:
或:
如您所见,堆已创建,但第一个元素未被触及。我如何解决这个问题
我想我可以扫描所有数组,找到最大值并将其放在基数(第一个位置),但有没有更优雅的方法来解决这个问题?有两种方法:要么分配一个比需要大一倍的数组,然后将第一个元素留空,或者更正所有索引公式以使用基于0的索引而不是基于1的索引。@问题是我真的不知道如何更正所有索引公式以使用0。。。我认为我可以找到数组的最大值并将其放在数组的第一个元素中,但我认为这会降低性能
44 18 40 40 11 4 14 6
44 40 40 18 11 4 14 6
30 43 21 41 25 16 36 20
30 43 25 41 21 16 36 20
42 38 19 20 32 35 17 21
42 38 35 21 32 19 17 20