Реализация HeapSort имеет исключение NullPointerException - PullRequest
0 голосов
/ 26 января 2019

У меня проблемы с реализацией HeapSort.По сути, я не знаю, как исправить мой IndexOutOfBoundsExcpetion.У меня есть не только класс HeapSort в файле, но и класс MinHeap.Скажите мне, если я должен добавить часть другого файла, где основной метод.Я использую счетчик для подсчета ключевых сравнений.Поскольку меня попросили, я добавляю основной метод внизу.

public class HeapSort {

    int[] heap;
    int size;
    int count;

    public HeapSort(int[] arr, int n, int counter) {
        this.heap = arr;
        this.size = n;
        this.count = counter;
    }

    public int[] buildHeap(int[] arr) {
        int[] build = new int[size];
        for (int i = 0; i < size; ++i) {
            build[i] = arr[i];
            if (!MinHeap.isHeap(build)) {
                int[] newBuild = new int[build.length];
                newBuild = MinHeap.restoreHeap(i);
                build = newBuild;
                count();
            }
        }
        return build;
    }

    //arr is already a Heap
    public int[] sort(int[] arr) {
        int[] sorted = new int[size];
        int val = size;
        for (int i = 0; size > 0; ++i) {
            int[] newArr = new int[--size];
            for (int j = 1; j < size; ++j) newArr[j - 1] = arr[j];
            arr = newArr;
            sorted[i] = MinHeap.pop();
            MinHeap.restoreHeap(0);
            count();
        }
        size = val;
        return sorted;
    }

    public void count() {
        ++count;
    }

    @Override
    public String toString() {
        int arr[] = buildHeap(heap);
        int[] array = sort(arr);
        String str = "[";
        for (int i = 0; i < size - 1; ++i) str += array[i] + ", ";
        return str += array[size - 1] + "]";
    }
}

class MinHeap {
    static int[] heap;
    static int size = 0;

    public MinHeap() {
        heap = new int[size];
    }

    static int[] restoreHeap(int index) {
        // TODO Auto-generated method stub
        int v; // current node
        int l; // child child
        int r; //right child
        while (2 * index + 1 < size) {
            v = heap[2 * index];
            l = heap[2 * index + 1];
            if (2 * index + 2 < size) r = heap[2 * index + 2];
            else r = 0;
            if (compare(l, v) || compare(r, v)) {
                //Swap with left child
                if (compare(l, r)) {
                    swap(index, index * 2 + 1);
                    index = index * 2 + 1;
                }
                //Swap with right child
                else if (compare(r, l)) {
                    swap(index, index * 2 + 2);
                    index = index * 2 + 2;
                }
            }
            else break;
        }
        return heap;
    }

    static void swap(int v1, int v2) {
        int tmp = v1;
        v1 = v2;
        v2 = tmp;
    }

        //Remove the first element
    static int pop() {
        int min = heap[0];
        heap[0] = heap[--size];
        heap = restoreHeap(0);
        return min;
    }

    static boolean compare(int left, int right) {
        return left < right;
    }

    static boolean isHeap(int[] arr) {
        // TODO Auto-generated method stub
        int v = 0;
        while (2 * v + 1 < size) {
            if (2 * v + 2 < size) {
                if (arr[v] > arr[2 * v + 1] || arr[v] > arr[2 * v + 2]) return false;
            } else if (arr[v] > arr[2 * v + 1]) return false;
            v *= 2;
        }
        return true;
    }

    static boolean isEmpty() {
        return size == 0;
    }
}

Основной метод (в другом файле):

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; ++i) arr[i] = scanner.nextInt();
        int[] sort = sorted.sort(arr);
        HeapSort sortHeap = new HeapSort(arr, n, 0);
        int[] toSort = sortHeap.buildHeap(arr);
        sort = sortHeap.sort(toSort);
        int count = sortHeap.count;
        if (count != 1) System.out.print("Heap Sort needed " + count + " key 
        comparisons for sorting the array to: ");
        else System.out.print("Heap Sort needed " + count + " key comparison for 
        sorting the array to: ");
        System.out.println(sortHeap.toString());
        scanner.close();
    }
}
...