From 0b12b9e115076f84b88893b9256eb7b9336a2b9f Mon Sep 17 00:00:00 2001 From: rask24 Date: Mon, 22 Jan 2024 17:21:02 +0900 Subject: [PATCH] implement large sort --- Makefile | 1 + include/push_swap.h | 3 +- src/sort/large_sort.c | 54 ++++++++++++++++++++++++++++++ src/sort/sort.c | 4 ++- test/test_sort.cpp | 78 ++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 137 insertions(+), 3 deletions(-) create mode 100644 src/sort/large_sort.c diff --git a/Makefile b/Makefile index 3f9b214..22defd0 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ SRC = $(SRC_DIR)/main.c \ $(SRC_DIR)/sort/sort.c \ $(SRC_DIR)/sort/micro_sort.c \ $(SRC_DIR)/sort/nano_sort.c \ + $(SRC_DIR)/sort/large_sort.c \ $(SRC_DIR)/stack_operations/push.c \ $(SRC_DIR)/stack_operations/swap.c \ $(SRC_DIR)/stack_operations/rotate.c \ diff --git a/include/push_swap.h b/include/push_swap.h index 9d54ef8..d7be986 100644 --- a/include/push_swap.h +++ b/include/push_swap.h @@ -6,7 +6,7 @@ /* By: reasuke +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/10 12:37:54 by reasuke #+# #+# */ -/* Updated: 2024/01/17 18:29:53 by reasuke ### ########.fr */ +/* Updated: 2024/01/22 16:55:46 by reasuke ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,6 +30,7 @@ t_list *generate_stack(int argc, char **argv); void sort(t_list **stack_a, t_list **stack_b, int num_a); void nano_sort(t_list **stack, int num_a); void micro_sort(t_list **stack_a, t_list **stack_b, int num_a); +void large_sort(t_list **stack_a, t_list **stack_b, int num_a); void operate_sa(t_list **stack_a); void operate_sb(t_list **stack_b); diff --git a/src/sort/large_sort.c b/src/sort/large_sort.c new file mode 100644 index 0000000..1c17057 --- /dev/null +++ b/src/sort/large_sort.c @@ -0,0 +1,54 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* large_sort.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: reasuke +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/01/22 16:55:10 by reasuke #+# #+# */ +/* Updated: 2024/01/22 17:02:49 by reasuke ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +// naive implement: insertion sort +// find smallest number of a +// rotate +// push to stack_b +// push to stack_a + +static void push_in_order(t_list **stack_a, t_list **stack_b, int num_a) +{ + int i; + + i = 1; + while (i <= num_a) + { + if (first_content(stack_a) == i) + { + operate_pb(stack_a, stack_b); + i++; + } + else + operate_ra(stack_a); + } +} + +static void push_revert(t_list **stack_a, t_list **stack_b, int num_a) +{ + int i; + + i = 0; + while (i < num_a) + { + operate_pa(stack_b, stack_a); + i++; + } +} + +void large_sort(t_list **stack_a, t_list **stack_b, int num_a) +{ + push_in_order(stack_a, stack_b, num_a); + push_revert(stack_a, stack_b, num_a); +} diff --git a/src/sort/sort.c b/src/sort/sort.c index b44876c..87da847 100644 --- a/src/sort/sort.c +++ b/src/sort/sort.c @@ -6,7 +6,7 @@ /* By: reasuke +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/15 15:10:35 by reasuke #+# #+# */ -/* Updated: 2024/01/17 16:08:05 by reasuke ### ########.fr */ +/* Updated: 2024/01/22 16:54:56 by reasuke ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,4 +18,6 @@ void sort(t_list **stack_a, t_list **stack_b, int num_a) nano_sort(stack_a, num_a); else if (num_a <= 5) micro_sort(stack_a, stack_b, num_a); + else + large_sort(stack_a, stack_b, num_a); } diff --git a/test/test_sort.cpp b/test/test_sort.cpp index 24f2a97..6650aab 100644 --- a/test/test_sort.cpp +++ b/test/test_sort.cpp @@ -1,7 +1,8 @@ // Copyright 2024, reasuke -#include #include +#include +#include #include "gtest/gtest.h" @@ -57,6 +58,49 @@ static void sort_test(int N) { close(stdout_copy); } +static void random_sort_test_main(int N) { + std::vector v(N); + for (int i = 0; i < N; ++i) { + v[i] = i + 1; + } + // shuffle vector + std::cout << std::endl; + std::random_device seed_gen; + std::mt19937 engine(seed_gen()); + std::shuffle(v.begin(), v.end(), engine); + // for (int i = 0; i < N; ++i) { + // std::cout << v[i] << ' '; + // } + // std::cout << '\n'; + t_list *stack_a = NULL; + t_list *stack_b = NULL; + for (int &i : v) { + ft_lstadd_back(&stack_a, ft_lstnew(new int(i))); + } + // sort + sort(&stack_a, &stack_b, N); + // check if the order is appropreate + for (int i = 1; stack_a; ++i, stack_a = stack_a->next) { + EXPECT_EQ(*(int *)stack_a->content, i); + } +} + +static void random_sort_test(int N) { + // save stdout + int stdout_copy = dup(STDOUT_FILENO); + // redirect stdout to /dev/null + int dev_null = open("/dev/null", O_WRONLY); + dup2(dev_null, 1); + close(dev_null); + + // execute test + random_sort_test_main(N); + + // revert stdout + dup2(stdout_copy, STDOUT_FILENO); + close(stdout_copy); +} + TEST(sort, oneElement) { sort_test(1); } @@ -76,3 +120,35 @@ TEST(sort, fourElements) { TEST(sort, fiveElements) { sort_test(5); } + +TEST(sort, sixElements) { + sort_test(6); +} + +TEST(sort, sevenElements) { + sort_test(7); +} + +TEST(sort, eightElementsRandom) { + random_sort_test(8); +} + +TEST(sort, nineElementsRandom) { + random_sort_test(9); +} + +TEST(sort, tenElementsRandom) { + random_sort_test(10); +} + +TEST(sort, hundredElementsRandom) { + random_sort_test(100); +} + +TEST(sort, twoHundredElementsRandom) { + random_sort_test(200); +} + +TEST(sort, thousandElementsRandom) { + random_sort_test(1000); +}