횽들 내가 문제보고 재귀함수 비재귀로 바꾸래서 해본건데

어떻게 떠오른 생각을 옮기다보니까 스택도 만들고 순환큐도 만들었어

그러다보니 푸쉬, 팝, 인큐, 디큐 같이 연산이 많아졌는데

코드도 몇줄밖에안되는게 꽤늘었고 이렇게 복잡해지더라도 비재귀가 재귀일때보다 효율이 좋은거야?

그리고 스택이랑 큐 말고 밑에있는 재귀함수 쉽게 비재귀로 효율좋게 만드는법 알려주면 ㄳㄳ

/* 재귀 함수 */

void MergeSort(int DataSet[], int StartIndex, int EndIndex)

{

     if ( EndIndex - StartIndex < 1 )
        return;
   
    MiddleIndex = (StartIndex + EndIndex) / 2;
   
    MergeSort( DataSet, StartIndex,    MiddleIndex );
    MergeSort( DataSet, MiddleIndex+1, EndIndex );
   
    Merge( DataSet, StartIndex, MiddleIndex, EndIndex );

}


 

/* 비재귀 함수 */

void MergeSort(int DataSet[], int StartIndex, int EndIndex)

{

     int MiddleIndex = (StartIndex + EndIndex) /2;
     element Tempelem;
     element Leftelem;
     element Rightelem;
     CircularQueue *CQ;
     CQ_CreateQueue(&CQ, 16);
     Tempelem.Sindex = StartIndex;
     Tempelem.Mindex = MiddleIndex;       
     Tempelem.Eindex = EndIndex;
     Push(Tempelem);
     Enqueue(CQ, Tempelem);
    

     while(!CQ_IsEmpty(CQ))
     {      
          Tempelem = Dequeue(CQ);
          Leftelem.Sindex = Tempelem.Sindex;
          Leftelem.Eindex = Tempelem.Mindex;
          Leftelem.Mindex = (Leftelem.Sindex + Leftelem.Eindex) /2;
      
          if(Leftelem.Eindex - Leftelem.Sindex >= 1)
          {
                Enqueue(CQ, Leftelem);
                Push(Leftelem);
          }
          Rightelem.Sindex = Tempelem.Mindex+1;
          Rightelem.Eindex = Tempelem.Eindex;
          Rightelem.Mindex = (Rightelem.Sindex + Rightelem.Eindex) /2;
          if(Rightelem.Eindex - Rightelem.Sindex >= 1)
          {
                Enqueue(CQ, Rightelem);
                Push(Rightelem);
          }
     }
     
     while(!StackIsEmpty())
     {
          Tempelem = Pop();
          Merge( DataSet, Tempelem.Sindex, Tempelem.Mindex, Tempelem.Eindex);
     }
}


마지막으로 내가 만든 비재귀가 재귀랑 정말 똑같이 돌아가는지도 잘모르겠어..ㅎㅎ