본문 바로가기

C Language

3개 남았을 때의 정렬 | sorting when three arguments are left

3개 남았을 때의 정렬 ❘ sorting when three arguments are left

이 함수는 스택에 있는 세 개의 인자를 정렬하는 `sort_three_args` 함수입니다. 

 

함수 구조 설명

변수 선언
int top;
int mid;
int bot;

스택의 상단, 중간, 하단 값을 저장할 세 개의 정수형 변수를 선언합니다.

값 할당

top = stacks->stack_a->top->right->val;
mid = stacks->stack_a->top->right->right->val;
bot = stacks->stack_a->top->right->right->right->val;

스택 A의 상단, 중간, 하단 값을 각각 `top`, `mid`, `bot` 변수에 할당합니다. 이 구조는 스택이 원형 연결 리스트로 구현되어 있음을 시사합니다.

정렬 로직
함수는 다섯 가지 경우를 고려하여 정렬을 수행합니다:

1. top > mid > bot (내림차순)
   if (top > mid && mid > bot && top > bot)
   {
       sa(stacks);
       rra(stacks);
   }
   이 경우, `sa` (swap a)로 상위 두 요소를 교환한 후, `rra` (reverse rotate a)로 스택을 한 번 역회전시킵니다.

2. top > bot > mid
   else if (top > mid && bot > mid && top > bot)
       ra(stacks);
   이 경우, `ra` (rotate a)로 스택을 한 번 회전시킵니다.

3. mid > bot > top
   else if (mid > top && mid > bot && bot > top)
   {
       sa(stacks);
       ra(stacks);
   }
   이 경우, `sa`로 상위 두 요소를 교환한 후, `ra`로 스택을 한 번 회전시킵니다.

4. bot > top > mid
   else if (top > mid && bot > mid && bot > top)
       sa(stacks);
   이 경우, `sa`로 상위 두 요소를 교환합니다.

5. mid > top > bot
   else if (mid > top && mid > bot && top > bot)
       rra(stacks);
   이 경우, `rra`로 스택을 한 번 역회전시킵니다.

주요 연산 설명

- `sa`: 스택 A의 상위 두 요소를 교환합니다.
- `ra`: 스택 A를 위로 회전시킵니다 (첫 번째 요소가 마지막으로 이동).
- `rra`: 스택 A를 아래로 회전시킵니다 (마지막 요소가 첫 번째로 이동).

이 함수는 세 개의 요소만을 정렬하므로, 가능한 모든 순열(3! = 6가지)에 대해 최적의 정렬 방법을 미리 정의해놓은 것으로 보입니다. 이는 작은 수의 요소를 정렬할 때 효율적인 방법입니다.

 

 

Here's the English translation of the detailed explanation for the `sort_three_args` function:

Function Structure Explanation

Variable Declaration
int top;
int mid;
int bot;
Three integer variables are declared to store the top, middle, and bottom values of the stack.

Value Assignment
top = stacks->stack_a->top->right->val;
mid = stacks->stack_a->top->right->right->val;
bot = stacks->stack_a->top->right->right->right->val;

The top, middle, and bottom values of stack A are assigned to the `top`, `mid`, and `bot` variables respectively. This structure suggests that the stack is implemented as a circular linked list.

Sorting Logic
The function considers five cases to perform the sorting:

1. top > mid > bot (descending order)
   if (top > mid && mid > bot && top > bot)
   {
       sa(stacks);
       rra(stacks);
   }
   ```
   In this case, it uses `sa` (swap a) to exchange the top two elements, then `rra` (reverse rotate a) to rotate the stack once in reverse.

2. top > bot > mid
   else if (top > mid && bot > mid && top > bot)
       ra(stacks);
   Here, it uses `ra` (rotate a) to rotate the stack once.

3. mid > bot > top
   else if (mid > top && mid > bot && bot > top)
   {
       sa(stacks);
       ra(stacks);
   }
   In this case, it uses `sa` to swap the top two elements, then `ra` to rotate the stack once.

4. bot > top > mid
   else if (top > mid && bot > mid && bot > top)
       sa(stacks);
   Here, it uses `sa` to swap the top two elements.

5. mid > top > bot
   else if (mid > top && mid > bot && top > bot)
       rra(stacks);
   In this case, it uses `rra` to rotate the stack once in reverse.

Key Operations Explained

- `sa`: Swaps the top two elements of stack A.
- `ra`: Rotates stack A upwards (first element moves to the last).
- `rra`: Rotates stack A downwards (last element moves to the first).

This function sorts only three elements, so it seems to have predefined optimal sorting methods for all possible permutations (3! = 6 cases). This is an efficient approach when sorting a small number of elements.