2014-01-03 2 views
1

Я неоднократно получаю ошибку StackOverflow в строке, помеченной ** Переполнение стека, если я пытаюсь отсортировать более трех чисел, но работает для массивов 3 или менее, поэтому я не думаю, что существует бесконечная рекурсия. Может кто-нибудь объяснить мне, почему строка 246, кажется, является источником переполнения стека?Ошибка Heapsort StackOverflow

Благодаря

public static void heapSort(double [] a,int node, int index, boolean upcheck){ 
if(node < 0){ 

} 
else if(node > a.length-index){ 
} 
else if(upcheck){ 
    if(!testHeap(a,node,(2*node)+1) || !testHeap(a,node,(2*node)+2)){ 
      int min = 0; 
      if(a[(2*node)+1] > a[(2*node)+2]){ 
       min = (2*node)+2; 
      } 
      else{ 
       min = (2*node)+1; 
      }    
      switchHeap(a,node,min); 

****************************heapSort(a,(node-1)/2,index,true);********************* 
     } 
    } 


else if(node == (a.length-index-1)/2){ 
    if((2*node)+1 <= a.length-index){ 
     if(testHeap(a,node,(2*node)+1)){    
     } 
     else{ 
      heapSort(a,(node-1)/2,index,true); 
     }   
     if((2*node)+2 <= a.length-index){ 
      if(testHeap(a,node,(2*node)+2)){ 
      } 
      else{ 
      heapSort(a,(node-1)/2,index,true); 
      } 
     } 
    } 
    switchHeap(a,0,a.length-index); 
    index++; 
    heapSort(a,0,index,false); 
} 
else{ 
    if((2*node)+1 <= a.length-index){ 
     if(testHeap(a,node,(2*node)+1)){    
     } 
     else{ 
      heapSort(a,(node-1)/2,index,true); 
     } 
     heapSort(a,(2*node)+1,index,false); 
     if((2*node)+2 <= a.length-index){ 
      if(testHeap(a,node,(2*node)+2)){ 
      } 
      else{ 
      heapSort(a,(node-1)/2,index,true); 
      } 
      heapSort(a,(2*node)+2,index,false); 
     } 
    } 
} 

}//heapSort - method 
+0

вы получаете StackOverflowError, когда ваш стек полон (в вашем случае его из-за рекурсии ..). – TheLostMind

+0

Спасибо, я понимаю, как это вызвано, но я не могу найти причин, почему код должен вызывать stackoverflow. Стек (я думаю) не больше, чем дерево. –

ответ

0

Вы получаете StackOverFlowError из-за рекурсивный вызов вы делаете в вашем коде. то есть

static void heapSort(double [] a,int node, int index, boolean upcheck) 

называет себя рекурсивно. Вы должны использовать break; в этом виде рекурсивных вызовов методов, когда работа выполняется

Из документации,

общественного класса StackOverflowError расширяет VirtualMachineError

Брошенный, когда стек переполнение происходит потому, что приложение слишком сильно пересчитывается.

Прочтите это link, чтобы узнать больше об ошибке. Принятый ответ объясняет это все

+0

I thinK У меня есть базовый футляр, в котором я проверяю, что узел существует. Нужно ли мне что-то более явное? Спасибо –

0

Everytime вы звоните

heapSort(a,(node-1)/2,index,true); 

стек будет в конечном итоге имеет свой собственный набор переменных (двойной [], Int узел INT индекс ...) .. это может быть вызывая проблему, если ваш размер ввода> 3 (слишком большая рекурсия ..).

Одним из решений может быть объявление только одного массива, который должен быть отсортирован на уровне экземпляра, а не на уровне метода, и передавать только индексы в ваших функциях вместо передачи массива.

это может помочь - http://www.vogella.com/articles/JavaAlgorithmsMergesort/article.html

+0

Спасибо за ссылку, однако heapsort предназначен для рекурсивного использования массивов? –