在heapsort中找到bug

时间:2018-04-22 11:58:40

标签: java heapsort

我正在尝试制作一个使用第0个索引的heapsort算法,并且适用于整数数组。

我对不同数组的测试表明,使最大堆正常工作的堆的第一部分。排序过程似乎在{33,12,5,85,2,10,11}的前两次运行中交换了正确的数字,但随后又交换了我的最后一个索引。即使代码的类似部分看起来很简单,我似乎也找不到错误。谢谢。

Before: [85, 33, 11, 12, 2, 10, 5]
After: [33, 12, 11, 5, 2, 10, 85]
After: [12, 10, 11, 5, 2, 33, 85]
After: [11, 10, 85, 5, 12, 33, 2]
After: [85, 10, 33, 11, 12, 5, 2]
After: [85, 10, 33, 11, 12, 5, 2]
After: [85, 12, 33, 11, 10, 5, 2]
After: [85, 12, 33, 11, 10, 5, 2]
[85, 12, 33, 11, 10, 5, 2]


package com.example.java;
import java.util.Arrays;
public class Main {

    public static void main(String[] args) {

        int[] test =  {33, 12, 5, 85, 2, 10, 11};
        heap mit = new heap(test);
        mit.heapsort(test);
        System.out.println(Arrays.toString(mit.getPq()));
    }
}




package com.example.java;
import java.util.Arrays;

public class heap {

    int N = 0;
    int[] pq = null;

    public heap (int[] n) {
        this.pq = new int[n.length];
        for (int i = 0; i <n.length ; i++) {
            pq[i] = n[i];
            N = n.length;
        }
    }
    public boolean less(int i, int j) {
        return pq[i] < pq[j];
    }
    public void exchange(int i, int j) {
        int a = pq[i];
        pq[i] = pq[j];
        pq[j] = a;
    }

    public int getN() {
        return N;
    }

    public int[] getPq() {
        return pq;
    }
    public void sink(int k) {
        while ((2*k)+1 < this.N) {
            int j = 2 * k + 1;
            if (j+1 < this.N) {
                if (less(j, j+1)) j++;
            } if (less(k, j)) {
                exchange(k, j);
                k = j;
            } else break;
        }
    }
    public void heapsort(int[] a) {
        int N = a.length;
        for (int k = N/2; k >=0 ; k--) {
            sink(k);
        }
        System.out.println("Before: " + Arrays.toString(pq));
        while (N>0) {
            N--;
            exchange(0, N);
            sink(0);
            System.out.println("After: " + Arrays.toString(pq));
        }

    }

}

0 个答案:

没有答案