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) {