Нужна помощь в реализации структуры данных кучи - PullRequest
0 голосов
/ 28 мая 2010

У меня есть операция с кучей, операция исправления ошибок. Это код:

public class Heap {

    public static void fixdown (int a[],int k,int n) {
        while (2*k<=n) {
            int j=2*k;
            if (j<n && a[j]<a[j+1]) j++;
            if (!(a[k]<a[j])) break;
            swap(a,k,j);
            k=j; 
        }
    }

    public  static void main (String[]args) {
        int a[]=new int[]{12,15,20,29,23,22,17,40,26,35,19,51};
        fixdown(a,1,a.length);
        for (int i=0;i<a.length;i++) {
            System.out.println(a[i]);
        }
    }

    public static void swap (int a[],int i,int j) {
        int t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
}

Обновление: я изменил его, и теперь нет ошибки.

// результат

12
29
20
40
23
22
17
15
26
35
19
51

Ответы [ 4 ]

1 голос
/ 28 мая 2010

у вас есть a[j]=k;

возможно, это должно быть a[j]=t;

1 голос
/ 28 мая 2010

a[j]=k;

Вы, вероятно, хотите:

a[j]=t;


В объявлениях массива

Пожалуйста, не создавайте привычку объявлять массивы следующим образом:

int x[];

Вместо этого следует ставить скобки с типом , а не с идентификатором :

int[] x;

Смежные вопросы

0 голосов
/ 28 мая 2010

Эти строки:

for (int i=0;i<a.length;i++){
 System.out.println(a[i]);

предполагает, что индексы в вашем массиве основаны на 0. Если это так, индексы левого и правого дочернего элемента элемента с индексом i должны быть рассчитаны как

leftchild_index = 2*i+1;
rightchild_index = 2*i+2; // rightchild_index = leftchild_index + 1

левый ребенок a[0] равен a[1], а правый a[2]

Если параметр n - это длина массива, содержащего кучу, необходимо исправить некоторые условия

while(2*k<=n){

следует изменить на:

while(2*k + 1 < n){

и

int j=2*k;
    if (j<n && a[j]<a[j+1])   j++;

следует изменить на

int j = 2 * k + 1;
    if (j < n - 1 && a[j] < a[j+1])   j++;

В противном случае вы обращаетесь к массиву за пределами.

0 голосов
/ 28 мая 2010

Код очень трудно читать в текущем состоянии отступа, но я считаю, что a[j]=k; должно быть a[j]=t;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...