summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--Makefile5
-rw-r--r--main.c127
3 files changed, 135 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..cf5f013
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+main
+font.png
+*.o
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..c88f7a1
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,5 @@
+main: main.o
+ gcc main.o -o main `sdl2-config --libs` -lSDL2_image
+
+main.o: main.c
+ gcc -c main.c -o main.o `sdl2-config --cflags`
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..4394abe
--- /dev/null
+++ b/main.c
@@ -0,0 +1,127 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <SDL.h>
+#include <SDL_image.h>
+
+#define ASCII_SPACE 32
+#define WINDOW_WIDTH 800
+#define WINDOW_HEIGHT 600
+#define SRC_FONT_WIDTH 7
+#define SRC_FONT_HEIGHT 9
+#define DST_FONT_WIDTH 28
+#define DST_FONT_HEIGHT 32
+#define ATLAS_WIDTH 18
+#define DATASET_SIZE 100
+#define STATS_SIZE 80
+
+int main(int argc, char **argv) {
+ srand(time(0));
+ SDL_Init(SDL_INIT_VIDEO);
+ IMG_Init(IMG_INIT_PNG);
+ SDL_Window *win = SDL_CreateWindow(
+ "Sorting algorithms",
+ SDL_WINDOWPOS_CENTERED,
+ SDL_WINDOWPOS_CENTERED,
+ WINDOW_WIDTH,
+ WINDOW_HEIGHT,
+ 0);
+ SDL_Renderer *ren = SDL_CreateRenderer(
+ win,
+ -1,
+ SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
+ SDL_Texture *font_atlas = IMG_LoadTexture(ren, "./font.png");
+
+ int to_be_sorted[DATASET_SIZE] = {0};
+ for (int i = 0; i < DATASET_SIZE;i++) {
+ to_be_sorted[i] = i + 1;
+ }
+ for (int i = 0; i < DATASET_SIZE; i++) {
+ int tmp = to_be_sorted[i];
+ int j = rand() % DATASET_SIZE;
+ to_be_sorted[i] = to_be_sorted[j];
+ to_be_sorted[j] = tmp;
+ }
+ int sort_index = 0;
+ int sort_index_internal = 0;
+ int comparisons = 0;
+ int swaps = 0;
+
+ while (1) {
+ SDL_Event e;
+ if (SDL_PollEvent(&e)) {
+ if (e.type == SDL_QUIT) {
+ break;
+ }
+ }
+
+ if (sort_index < DATASET_SIZE - 1) {
+ if (sort_index_internal >= 0
+ && to_be_sorted[sort_index_internal] > to_be_sorted[sort_index_internal + 1]) {
+ int tmp = to_be_sorted[sort_index_internal + 1];
+ to_be_sorted[sort_index_internal + 1] = to_be_sorted[sort_index_internal];
+ to_be_sorted[sort_index_internal] = tmp;
+ sort_index_internal--;
+ comparisons++;
+ swaps++;
+ } else {
+ sort_index++;
+ sort_index_internal = sort_index;
+ comparisons++;
+ }
+ }
+
+ SDL_SetRenderDrawColor(ren, 0, 0, 0, 255);
+ SDL_RenderClear(ren);
+
+ char stats[STATS_SIZE] = {0};
+ sprintf(stats, "Comparisons: %d\nSwaps: %d", comparisons, swaps);
+ int line = 0;
+ int col = 0;
+ for (int i = 0; i < STATS_SIZE; i++) {
+ if (stats[i] == '\n') {
+ line++;
+ col = 0;
+ } else {
+ col++;
+ }
+ SDL_Rect src = {
+ (stats[i] - ASCII_SPACE) % ATLAS_WIDTH * SRC_FONT_WIDTH,
+ (stats[i] - ASCII_SPACE) / ATLAS_WIDTH * SRC_FONT_HEIGHT,
+ SRC_FONT_WIDTH,
+ SRC_FONT_HEIGHT
+ };
+ SDL_Rect dst = {
+ col * DST_FONT_WIDTH,
+ line * DST_FONT_HEIGHT,
+ DST_FONT_WIDTH,
+ DST_FONT_HEIGHT
+ };
+ SDL_RenderCopy(ren, font_atlas, &src, &dst);
+ }
+
+ for (int i = 0; i < DATASET_SIZE; i++) {
+ SDL_Rect bar = {
+ i * WINDOW_WIDTH / DATASET_SIZE,
+ WINDOW_HEIGHT,
+ WINDOW_WIDTH / DATASET_SIZE,
+ -to_be_sorted[i] * (int) (WINDOW_HEIGHT * 0.8) / DATASET_SIZE
+ };
+ if (sort_index_internal == i - 1) {
+ SDL_SetRenderDrawColor(ren, 0, 255, 0, 255);
+ } else if (sort_index == i - 1) {
+ SDL_SetRenderDrawColor(ren, 255, 0, 0, 255);
+ } else {
+ SDL_SetRenderDrawColor(ren, 255, 255, 255, 255);
+ }
+ SDL_RenderFillRect(ren, &bar);
+ }
+
+ SDL_RenderPresent(ren);
+ }
+ SDL_DestroyWindow(win);
+ SDL_DestroyRenderer(ren);
+ IMG_Quit();
+ SDL_Quit();
+ return 0;
+}