/media/sda-magnetic/david/Dokumente-15/fernuni-hagen/cs-i-ii/old-cs-2-03/sort-and-algorithms/selection3.c


#include <stdio.h>
#include <stdlib.h>
#include <time.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 c[N_MAX];
    int tmp;
    int i, j, k, l;
    int d;
    int n;
    int s;
    int start1, end1, start2, end2, i1, i2;
    int tmp2;
    
    srand(time(NULL));
    
    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i] = rand() % 30;
    
    for(i = 0;  i < N_MAX;  i++)
        printf("%i ", a[i]);
    
    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;
            }
        }
    }
    
    printf("\n\n");
    
    for(i = 0;  i < N_MAX;  i++)
        printf("%i ", a[i]);
    
    printf("\n\n");
    
    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i];

    for(i = 0;  i < N_MAX;  i++)
        printf("%i ", a[i]);

    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;
            }
        }
    }
    
    printf("\n\n");
    
    for(i = 0;  i < N_MAX;  i++)
        printf("%i ", a[i]);

    printf("\n\n");
    
    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i];

    for(i = 0;  i < N_MAX;  i++)
        printf("%i ", a[i]);
    
    printf("\n\n");
    
    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++)
        printf("%i ", a[i]);

    printf("\n\n");
    
    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i];

    for(i = 0;  i < N_MAX;  i++)
        printf("%i ", a[i]);

    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;
            }
        }
    }

    printf("\n\n");
    
    for(i = 0;  i < N_MAX;  i++)
        printf("%i ", a[i]);

    
    printf("\n\n");
    
    
    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i];
    
    for(i = 0;  i < N_MAX;  i++)
        printf("%i ", a[i]);

    
    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;
            }
        }
    }
    
    printf("\n\n");
    
    for(i = 0;  i < N_MAX;  i++)
        printf("%i ", a[i]);

    
    printf("\n\n");

    
    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i];
    
    for(i = 0;  i < N_MAX;  i++)
        printf("%i ", a[i]);

    
    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;
            }
        }
    }
    
    printf("\n\n");
    
    for(i = 0;  i < N_MAX;  i++)
        printf("%i ", a[i]);

    
    printf("\n\n");
    
    
    
    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i];
    
    for(i = 0;  i < N_MAX;  i++)
        printf("%i ", a[i]);
 
    
    for(d = 4;  d > 1; d--) {
        printf("\n");
        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;
                }
            }
        }
        printf("\n\n");
        for(i = 0;  i < N_MAX;  i++)
            printf("%i ", a[i]);
    }

    
    printf("\n\n");
    
    for(i = 0;  i < N_MAX;  i++) 
        a[i] = b[i];
    
    for(i = 0;  i < N_MAX;  i++)
        printf("%i ", a[i]);
    
    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;
        }
    }
    
    printf("\n");
    
    for(i = 0;  i < N_MAX;  i++)
        printf("%i ", a[i]);
    
    printf("\n\n");

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

    printf("\n");
    
    for(i = 0;  i < N_MAX;  i++)
        printf("%i ", a[i]);    

    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;
            }
        }
    }
    
    printf("\n");
    
    for(i = 0;  i < N_MAX;  i++)
        printf("%i ", a[i]);
    
 
    printf("\n");

return 0;
}