2011-10-05 5 views
-1
RecursiveSort::RecursiveSort(int myArray[], int first, int arraySize) 
{ 
    int smallest = first, j; 

    if (smallest < arraySize) 
    { 
     smallest = first; 
     for (j=first+1; j<arraySize; j++) 
     { 
      if (myArray[j] < myArray[smallest]) 
      { 
       smallest = j; 
      } 
     } 
     swap(myArray[first], myArray[smallest]); 
     first++; 
     RecursiveSort::RecursiveSort(myArray, first, arraySize); 
    } 
}; 

내 메인(); 나는 RecursiveSort sort (myArray, 0, arraySize)를 호출 할 것이다.재귀 선택 정렬 알고리즘에서 클래스 소멸자를 호출하려면 어떻게해야합니까?

arraySize> 4000 일 때 스택 오버 플로우가 발생하여 프로그램이 충돌합니다. 스택 소멸을 막기 위해 클래스 소멸자를 어딘가에 호출 할 수 있습니까? "디버그"(프로젝트 속성> 구성 관리자> 구성 풀다운 메뉴) 대신 "릴리스"를 사용해 보았습니다. 그러나 정렬에 걸리는 시간을 측정하는 데 사용되는 "TimeStamp_Lib.lib"라이브러리를 통합하려고하면 다른 문제가 발생합니다.

모든 조언/제안을 주시면 감사하겠습니다. 감사합니다.

답변

0

예, 소멸자를 수동으로 호출 할 수 있습니다. 그러나 그들은 객체를 파괴하고 메모리를 비우지 않습니다. 재귀는 생각하기 쉽지만 실생활에서 그렇게 유용하지는 않습니다. 모든 개체를 스택 외부의 풀로 이동하거나 반복적 인 방식으로 작업하는 것이 좋습니다.

+0

정확히 어떻게 객체를 스택 외부의 풀로 옮길 수 있습니까? 숙제는 선택 정렬 알고리즘 2 개를 쓰는 것이고, 하나는 반복을 사용하고 다른 하나는 재귀를 사용하는 것입니다. 그래서 불행히도 스택 오버플로를 막을 수있는 방법을 찾아야 할 것입니다 : ( – billy

+2

@billy : 함수가 클래스 생성자로 선언 된 이유는 무엇입니까? –

+0

대신 'RecursiveSort.RecursiveSort'를 사용해야합니까? – billy

1

해당 기능에 할당이 없습니다. 문제는 너무 많은 메모리를 할당 한 것이 아닙니다.

나는 너무 많은 시간을 반복하고 있다고 생각합니다. 알고리즘 변경이 필요하거나이 방법으로 정렬 할 수있는 항목 수 제한이 필요합니다. 컴파일러가 재귀를 최적화 할 수있는 방식으로이를 변경할 수 있다면 구현이 가능할 수도 있지만 재귀를 최적화 할 수 있습니다. 더 좋은 방법은 재귀를 직접 제거하고 스택 기반 루프로 변경하는 것입니다. Here's 그 밖의 정보에 대한 자세한 정보

2

이 기능을 무료로 만들어야 개체가 생성되지 않습니다. 어떤 이유로 알고리즘이 클래스의 생성자에서 실행되어야하는 경우 생성자에서 알고리즘을 호출 할 수 있습니다.

즉, 컴파일러가 반복 자체를 최적화하지 않는 한 재귀는 그 깊이로 진행해야하는 알고리즘에는 적합하지 않습니다. 4000 개의 정수를 정렬하기 위해 함수는 4000 개의 깊이로 이동하여 많은 스택 공간을 차지합니다. 비교해 보면, 빠른 정렬은 log2 (4000) = 12 레벨로 깊숙이 간다.

관련 문제