diff --git a/main.c b/main.c index 1673221c77fda97cc374c38093181d39f2dd0fbc..5fbf95c6aef9148f0810ba2f13d619bcf00bbb1c 100644 --- a/main.c +++ b/main.c @@ -14,13 +14,25 @@ #include "stack.h" -void pop_left_push_right(stack *left_stack, stack *right_stack, int current_value) { +typedef enum _sort_behavior { + behavior_lower, + behavior_higher, + behavior_none, +} sort_behavior; + +void pop_left_push_right(stack *left_stack, stack *right_stack, int current_value, sort_behavior sb) { while (!stack_is_empty(*left_stack)) { int tmp; stack_peek(*left_stack, &tmp); - if (current_value < tmp) { - break; + if (sb == behavior_lower) { + if (current_value < tmp) { + break; + } + } else if (sb == behavior_higher) { + if (current_value > tmp) { + break; + } } stack_pop(left_stack, &tmp); @@ -28,20 +40,6 @@ void pop_left_push_right(stack *left_stack, stack *right_stack, int current_valu } } -void pop_right_push_left(stack *right_stack, stack *left_stack, int current_value) { - while (!stack_is_empty(*right_stack)) { - int tmp; - stack_peek(*right_stack, &tmp); - - if (current_value > tmp) { - break; - } - - stack_pop(right_stack, &tmp); - stack_push(left_stack, tmp); - } -} - void sort_array(int *array, int array_length) { stack left_stack; stack_init(&left_stack, array_length); @@ -50,19 +48,15 @@ void sort_array(int *array, int array_length) { for (int i = 0; i < array_length; i += 1) { // Pop values from left stack to right stack. - pop_left_push_right(&left_stack, &right_stack, array[i]); + pop_left_push_right(&left_stack, &right_stack, array[i], behavior_lower); // Pop values from right stack to left stack. - pop_right_push_left(&right_stack, &left_stack, array[i]); + pop_left_push_right(&right_stack, &left_stack, array[i], behavior_higher); // Push to left stack. stack_push(&left_stack, array[i]); } // Until right stack is empty pop value from right stack and push it to left stack. - while (!stack_is_empty(right_stack)) { - int tmp; - stack_pop(&right_stack, &tmp); - stack_push(&left_stack, tmp); - } + pop_left_push_right(&right_stack, &left_stack, 0, behavior_none); // Until the left stack is empty, pop the value and place it in the array. for (int i = 0; i < array_length; i += 1) {