본문 바로가기

전체 글

(101)
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` 변수에 할당합니다. 이 구조는 스택이 원형 연결 리스트로 구현되어 있음을 시사합니다. 정렬 로직 함수는 다섯 가지 경우를 고려하여..
피봇을 사용한 스택 정렬 알고리즘 | Stack sorting algorithm using pivots 이 코드는 스택 정렬 알고리즘의 일부로 , 피벗을 사용하여 스택을 세 부분으로 나누는 함수입니다. 함수 개요 void divide_pivot(t_var *stacks) 이 함수는 t_var 구조체 포인터인 stacks를 매개변수로 받습니다. 이 구조체는 두 개의 스택(stack_a와 stack_b)과 관련 정보를 포함하고 있을 것으로 추정됩니다.  주요 변수 tmp: 현재 처리 중인 노드를 임시 저장 times: 반복 횟수를 추적 p1, p2: 두 개의 피벗 값 stacks->max_size: 전체 요소의 수  피벗 설정 p1 = stacks->max_size / 3; p2 = (stacks->max_size / 3) * 2; 전체 요소 수를 3등분하여 두 개의 피벗을 설정합니다. p1은 하위 1/3 지..
스택 정렬 알고리즘 | Stack sorting algorithm sort_args는 스택 정렬 알고리즘입니다. 함수 개요 이 함수는 t_var *stacks라는 구조체 포인터를 매개변수로 받습니다. 이 구조체는 두 개의 스택(A와 B)과 관련 정보를 포함하고 있는 것으로 추정됩니다.  주요 단계 초기 분할 divide_pivot(stacks); 이 함수는 스택 A의 요소들을 피벗을 기준으로 분할합니다. 피벗보다 작은 요소들은 스택 B로 이동될 것으로 예상됩니다.  스택 A 크기 축소 while (stacks->a_size > 3)     pb(stacks); 스택 A의 크기가 3 이하가 될 때까지 요소들을 스택 B로 옮깁니다. pb 함수는 "push to B"를 의미합니다.  소규모 정렬  스택 A의 크기가 2인 경우: if (stacks->a_size == 2) {..
스택의 현재 크기와 최대크기 | Current/Maximum size of stack 이 두 줄의 코드는 같은 값(stacks->list_size)을 사용하지만, 그 의미와 용도가 다릅니다. 이를 상세히 설명하겠습니다:stacks->a_size = stacks->list_size;목적: 현재 스택 A에 있는 요소의 수를 나타냅니다.의미: 초기에 모든 요소가 스택 A에 있음을 의미합니다.변화 가능성: 정렬 과정에서 이 값은 변할 수 있습니다. stacks->max_size = stacks->list_size;목적: 전체 데이터셋의 크기를 나타냅니다.의미: 정렬해야 할 총 요소의 수를 의미합니다.변화 가능성: 이 값은 정렬 과정 동안 변하지 않습니다.예시를 들어 설명하겠습니다: 초기 상태:정렬할 숫자: [3, 1, 4, 2, 5]list_size = 5a_size = 5 (모든 요소가 스택 ..
인덱싱된 값들을 스택에 차례로 쌓는 함수 | Function to load the indexed values into the stack stacking 함수는 인덱싱된 값들을 스택 A에 쌓는 역할을 합니다. 이 함수를 상세히 설명하겠습니다: 함수 선언:t_var *stacks를 매개변수로 받습니다. 이는 스택 정보와 리스트를 포함하는 구조체입니다. 변수 선언:t_node *new_node: 새로 생성할 노드를 가리키는 포인터int idx: 루프 카운터 스택 쌓기 과정:idx를 0으로 초기화하고, stacks->list_size만큼 반복합니다. 각 반복에서:a. get_new_node(stacks->list[idx] + 1)를 호출하여 새 노드를 생성합니다.여기서 + 1을 하는 이유는 아마도 0부터 시작하는 인덱스를 1부터 시작하도록 조정하기 위함입니다.b. push_bottom(stacks->stack_a, new_node)를 호출하여 ..
상대적 순위로 변환 최적화 | Optimizing by relative ranking transformation indexing 함수는 원본 리스트의 값들을 그들의 순위(인덱스)로 변환하는 작업을 수행합니다. 이 함수를 단계별로 상세히 설명하겠습니다:함수 선언:t_var *stacks를 매개변수로 받습니다. 이는 리스트와 관련 정보를 포함하는 구조체입니다. 변수 선언:idx_list: 새로운 인덱스 값들을 저장할 정수 배열 포인터idx: 루프 카운터 및 순위 할당에 사용될 변수max_idx: find_list_max 함수의 반환값을 저장할 변수 메모리 할당:idx_list에 stacks->list_size 만큼의 정수 배열 공간을 동적 할당합니다.할당 실패 시 ps_error() 함수를 호출합니다. 인덱싱 과정:idx를 stacks->list_size - 1로 초기화합니다 (가장 큰 순위부터 시작).루프를 통해 모..
최대값을 이용하여 정렬하기 | Sorting by finding maximum value 이 find_list_max 함수는 리스트에서 최대값을 찾고 그 인덱스를 반환하도록 설계되었습니다. 함수의 작동 방식을 상세히 설명하겠습니다:함수 매개변수:t_var *stacks: 리스트와 그 크기를 포함하는 구조체에 대한 포인터입니다. 지역 변수:max: 발견된 최대값을 저장합니다.idx: 리스트를 순회하는 데 사용되는 인덱스입니다. 첫 번째 루프:max를 32비트 정수의 최소 가능 값(-2147483648)으로 초기화합니다.전체 리스트(stacks->list)를 순회합니다.더 큰 값이 발견될 때마다 max를 업데이트합니다. 두 번째 루프:리스트에서 최대값의 첫 번째 출현을 검색합니다.발견되면 해당 값을 -2147483648로 대체합니다(향후 검색에서 효과적으로 제거).최대값의 인덱스를 반환합니다. ..
퀵정렬과 greedy 알고리즘 | Quick sort & greedy algorithm 퀵정렬과 그리디 알고리즘은 문제 해결 접근 방식에서 큰 차이를 보이는 알고리즘입니다. 두 알고리즘을 상세히 비교 분석해 보겠습니다.기본 원리퀵정렬- 분할 정복(divide and conquer) 원칙에 기반합니다.- 피벗 요소를 선택하고 배열을 재배치하여 피벗을 기준으로 작은 값과 큰 값을 분리합니다.- 재귀적으로 하위 배열에 대해 같은 과정을 반복합니다.그리디 알고리즘- 각 단계에서 현재 상황에서 가장 최적인 선택을 합니다.- 한 번 선택한 결정을 번복하지 않습니다.- 전체적인 최적해를 보장하지는 않지만, 지역적 최적해를 찾습니다.시간 복잡도퀵정렬- 평균 및 최선의 경우: O(n log n)- 최악의 경우: O(n^2) (피벗 선택이 불균형할 때)그리디 알고리즘- 일반적으로 O(n) 또는 O(n log..