我可以创建堆,但是数组的第一个元素是不变的

h7appiyu  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(204)

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] + " ");
        }
    }   
}

输出如下:

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

如您所见,堆已创建,但第一个元素未被触及。我怎样才能解决这个问题?
我以为我可以扫描所有数组,找到最大值并将其放在基数(第一个位置),但有没有更优雅的方法来解决这个问题?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题