Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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_Sorting_Heap_Heapsort - Fatal编程技术网

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;

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;
        }
        
        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