J'écris un programme pour exécuter un tri de tas. Lorsque j'essaie d'exécuter la fonction removeMin et un downheap, il semble que je reçois toujours une sortie incorrecte.Downheap sur tableau donnant une mauvaise sortie
Par exemple, si je entrée 10 entiers dans cet ordre:
3, 6, 8, 3, 89, 35, 7, 9, 1, 4
Je me attends
1, 3, 3, 4, 6, 7, 8, 9, 35, 89
Mais je reçois:
1, 3, 3, 4, 6, 7, 8, 9, 35, 35
Voici mon code tas de code:
public class heapsort {
private Integer[] myHeap;
private int size;
private int maxSize;
public heapsort (int x){
myHeap = new Integer[x+1];
maxSize=x;
size=0;
}
public void min(){
if (isEmpty())
System.out.print("Is empty");
else
System.out.println(myHeap[0]);
}
public boolean isEmpty(){
return (size==0);
}
public int size(){
return size;
}
public void insert(int x){
if (size==maxSize)
System.out.println("Heap is full");
else{
size++;
myHeap[size] = x;
upheap(size);
}
}
public void upheap(int x){
int temp;
if (x>1){
if (myHeap[x]<myHeap[x/2]){
temp = myHeap[x];
myHeap[x]=myHeap[x/2];
myHeap[x/2]=temp;
upheap(x/2);
}
}
}
public void removeMin(){
int temp;
temp = myHeap[1];
myHeap[1]=myHeap[size-1];
size--;
if (size>1){
downheap(1);
}
System.out.println(temp);
}
public void downheap(int x){
int temp;
int temp, minIndex, left=2*x, right=2*x+1;
if (right>=size){
if (left>=size)
return;
else
minIndex=left;
}
else{
if (myHeap[left] <= myHeap[right])
minIndex = left;
else
minIndex = right;
}
if (myHeap[x] > myHeap[minIndex]){
temp = myHeap[minIndex];
myHeap[minIndex]=myHeap[x];
myHeap[x]=temp;
downheap(minIndex);
}
}
Suivi par mon programme principal:
public static void main (String[] args){
int i=0;
Scanner input = new Scanner(System.in);
System.out.println("Enter array size: ");
int n = input.nextInt();
heapsort myArray = new heapsort(n);
System.out.println("Please input integers");
for (i=1; i<=n; i++){
myArray.insert(input.nextInt());
}
while (!myArray.isEmpty()){
myArray.removeMin();
}
}
}
Juste une idée, dans 'removeMin()', devrait-il être 'if (size> = 1)'? –
Avez-vous essayé un débogueur? Une autre astuce, trouver l'exemple minimal qui donne l'erreur. Pouvez-vous reproduire l'erreur avec seulement trois entiers? Deux entiers? Un entier? –
Je suis presque sûr que la ligne 'myHeap [1] = myHeap [taille-1];' dans 'removeMin()' devrait être 'myHeap [1] = myHeap [taille]'. Si vous insérez un élément, quand 'insert()' finit, 'size' est mis à 1. Si vous appelez' removeMin() ', cela retournera' myHeap [0] ', ce qui est une valeur indéfinie. –