diff options
| author | El-BG-1970 <elouan.gros.fr@gmail.com> | 2021-11-04 14:02:53 +0100 |
|---|---|---|
| committer | El-BG-1970 <elouan.gros.fr@gmail.com> | 2021-11-04 14:02:53 +0100 |
| commit | e05f27daad51b0fa411842cd21a6893c4c01664f (patch) | |
| tree | e92df755d9b4d234668aaf4c6ae329f0ef255814 | |
| parent | 1eba17706f0c019bff9b06c90e38d41dc3f3ab7e (diff) | |
| download | org-to-conky-e05f27daad51b0fa411842cd21a6893c4c01664f.tar.gz | |
hybrid sorting algorithm
| -rw-r--r-- | GNUmakefile | 4 | ||||
| -rw-r--r-- | agenda_entry.c | 35 | ||||
| -rw-r--r-- | agenda_entry.h | 1 |
3 files changed, 37 insertions, 3 deletions
diff --git a/GNUmakefile b/GNUmakefile index 8283c98..f6651dd 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,8 +1,8 @@ CC=clang --std=gnu99 -CFLAGS=-Wall -Wextra -Werror# -g -pg +CFLAGS=-Wall -Wextra -Werror -g# -pg LIBS= -BLDFLAGS=-O2# -g -pg +BLDFLAGS=-O2 -g# -pg TARGET=otc DEPS=main.c agenda_entry.c date.c diff --git a/agenda_entry.c b/agenda_entry.c index d3fc466..f21ac2a 100644 --- a/agenda_entry.c +++ b/agenda_entry.c @@ -69,7 +69,24 @@ char *format_entry(entry e) { } void sort_entry_array(entry *arr, int n) { - merge_sort_entry_array(arr, n); + if (n == 1) return; + + merge_sort_entry_array(arr,n); + return; + + int halfway = n/2; + if (n <= 32) { + insertion_sort_entry_array(arr, n); + } else { + if (halfway <= 32) { + insertion_sort_entry_array(arr, halfway); + insertion_sort_entry_array(arr+halfway, n - halfway); + } else { + sort_entry_array(arr, halfway); + sort_entry_array(arr+halfway, n - halfway); + } + merge_entry_array(arr, halfway, n); + } } void merge_sort_entry_array(entry *arr, int n) { @@ -82,6 +99,22 @@ void merge_sort_entry_array(entry *arr, int n) { merge_entry_array(arr, halfway, n); } +void insertion_sort_entry_array(entry *arr, int n) { + if (n == 1) return; + + int j = 0; + entry sw; + for (int i = 1; i < n; i++) { + j = i - 1; + while (j >= 0 && smaller(arr[j+1].date, arr[j].date)) { + sw = arr[j]; + arr[j] = arr[j+1]; + arr[j+1] = sw; + j--; + } + } +} + void merge_entry_array(entry *arr, int halfway, int n) { int i = 0, j = halfway; diff --git a/agenda_entry.h b/agenda_entry.h index fbaef0b..8f13b2d 100644 --- a/agenda_entry.h +++ b/agenda_entry.h @@ -22,6 +22,7 @@ entry read_agenda_entry(char *agenda); char *format_entry(entry e); void merge_entry_array(entry *arr, int halfway, int n); +void insertion_sort_entry_array(entry *arr, int n); void merge_sort_entry_array(entry *arr, int n); void sort_entry_array(entry *arr, int n); void print_entry(entry e); |
