/media/sda-magnetic/david/Extern-Magnetic-2022-06-29/Extern01/Dokumente-2021-05-8/disk10-ab-2020-01-10/02-debian-pc2-work/informatik/avr/selection-sort-2020-01-01/main.c


#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>
#include <string.h>
#include "lcd-routines.h"


#define N_MAX 32

int (*cmp)(int a, int b);

int less(int a, int b) {
return (a < b);
}

int greaterequal(int a, int b) {
return (a >= b);
}

int main(void) {
    int a[N_MAX];
    int b[N_MAX];
    int tmp;
    int i, j, l;
    int d;
    int n;
    int s;
    char outstr[256];
    
    lcd_init();
    
    srand(5);
    
    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i] = rand() % 30;
    
    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);
        lcd_string(outstr);
    }
    
    for(i = 0;  i < N_MAX;  i++) {
        for(j = i + 1;   j < N_MAX;  j++) {
            if(a[j] < a[i]) {
                tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
        }
    }
    
    sprintf(outstr, "\n\n");
    lcd_string(outstr);
    
    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);
        lcd_string(outstr);
    }
    
    sprintf(outstr, "\n\n");
    lcd_string(outstr);
    
    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i];

    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);
        lcd_string(outstr);
    }

    for(i = N_MAX - 1;  i > 0;  i--) {
        for(j = i - 1;   j >= 0;  j--) {
            if(a[i] < a[j]) {
                tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
        }
    }
    
    sprintf(outstr, "\n\n");
    lcd_string(outstr);
    
    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);
        lcd_string(outstr);
    }

    sprintf(outstr, "\n\n");
    lcd_string(outstr);
    
    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i];

    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);
        lcd_string(outstr);
    }
    
    sprintf(outstr, "\n\n");
    lcd_string(outstr);
    
    for(i = 0;  i < N_MAX;  i++) {
        for(j = i + 1;   j < N_MAX;  j++) {
            if(a[i] < a[j]) {
                tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
        }
    }

    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);
        lcd_string(outstr);
    }

    sprintf(outstr, "\n\n");
    lcd_string(outstr);
    
    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i];

    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);
        lcd_string(outstr);
    }

    for(i = N_MAX - 1;  i > 0;  i--) {
        for(j = i - 1;   j >= 0;  j--) {
            if(a[i] > a[j]) {
                tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
        }
    }

    sprintf(outstr, "\n\n");
    lcd_string(outstr);
    
    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);
        lcd_string(outstr);
    }

    
    sprintf(outstr, "\n\n");
    lcd_string(outstr);
    
    
    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i];
    
    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);
        lcd_string(outstr);
    }

    
    d = 1;
    
    if(i < 0) {
        s = N_MAX;
        n = 0;
        cmp = greaterequal;
    }
    else {
        s = 0;
        n = N_MAX;
        cmp = less;
    }
         
    for (i = s;  cmp(i,n);  i += d) {
        for(j = i;  cmp(j, n);  j += d) {
            if(cmp(a[i], a[j])) {
                tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
        }
    }
    
    sprintf(outstr, "\n\n");
    lcd_string(outstr);
    
    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);
        lcd_string(outstr);
    }

    
    sprintf(outstr, "\n\n");
    lcd_string(outstr);

    
    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i];
    
    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);
        lcd_string(outstr);
    }

    
    d = -1;
    
    if(d < 0) {
        s = N_MAX;
        n = 0;
        cmp = greaterequal;
    }
    else {
        s = 0;
        n = N_MAX-1;
        cmp = less;
    }
         
    for (i = s;  cmp(i,n);  i += d) {
        for(j = i;  cmp(j, n);  j += d) {
            if(cmp(a[i], a[j])) {
                tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
        }
    }
    
    sprintf(outstr, "\n\n");
    lcd_string(outstr);
    
    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);
        lcd_string(outstr);
    }

    
    sprintf(outstr, "\n\n");
    lcd_string(outstr);
    
    
    
    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i];
    
    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);
        lcd_string(outstr);
    }
 
    
    for(d = 4;  d > 1; d--) {
        sprintf(outstr, "\n");
        lcd_string(outstr);
        if(d < 0) {
            s = N_MAX;
            n = 0;
            cmp = greaterequal;
        }
        else {
            s = 0;
            n = N_MAX-1;
            cmp = less;
        }
        for (i = s;  cmp(i,n);  i += d) {
            for(j = i;  cmp(j, n);  j += d) {
                if(cmp(a[i], a[j])) {
                    tmp = a[i];
                    a[i] = a[j];
                    a[j] = tmp;
                }
            }
        }
        sprintf(outstr, "\n\n");
        lcd_string(outstr);
        for(i = 0;  i < N_MAX;  i++) {
            sprintf(outstr, "%i ", a[i]);
            lcd_string(outstr);
        }
    }

    
    sprintf(outstr, "\n\n");
    lcd_string(outstr);
    
    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i];
    
    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);
        lcd_string(outstr);
    }
    
    for(i = 0;  i < N_MAX;  i+= 2) {
        if(a[i] > a[i+1]) {
            tmp = a[i];
            a[i] = a[i+1];
            a[i+1] = tmp;
        }
    }
    
    sprintf(outstr, "\n");
    lcd_string(outstr);
    
    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);
        lcd_string(outstr);
    }
    
    sprintf(outstr, "\n\n");
    lcd_string(outstr);

    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i];

    sprintf(outstr, "\n");
    lcd_string(outstr);
    
    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);    
        lcd_string(outstr);
    }

    for(i = 0;  i < N_MAX/2;  i++) {
        for(j = i, l = N_MAX - 1 -i; j < N_MAX/2;  j++, l--) {
            if(a[j] < a[i]) {
                tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
            if(a[l] > a[N_MAX - 1 -i]) {
                tmp = a[N_MAX - 1 -i];
                a[N_MAX - 1 -i] = a[l];
                a[l] = tmp;
            }
        }
    }
    
    sprintf(outstr, "\n");
    lcd_string(outstr);
    
    for(i = 0;  i < N_MAX;  i++) {
        sprintf(outstr, "%i ", a[i]);
        lcd_string(outstr);
    }
    
 
    sprintf(outstr, "\n");
    lcd_string(outstr);

return 0;
}