Commit bb078471 authored by Paffenholz, Andreas's avatar Paffenholz, Andreas
Browse files

programs ch 09

parent dd08af23
4 3 17 6 4 2 35 8 1 5 12
/*************************************
* Beispielprogramm zur Vorlesung
* Einfuehrung in die Programmierung I
* Andreas Paffenholz
* TU Darmstadt, Wintersemester 2020/21
* (c) 2020-
* Sortieren mit MergeSort
* * Bibliothek zu MergeSort
**************************************/
#include <stdlib.h>
#include "mergesort.h"
void merge(int* a, int l, int m, int u) {
int aux[u-l];
int l_counter=l, u_counter=m, aux_counter=0;
while ( l_counter < m && u_counter < u) {
if ( a[l_counter] < a[u_counter] )
aux[aux_counter++] = a[l_counter++];
else
aux[aux_counter++] = a[u_counter++];
}
while ( l_counter < m )
aux[aux_counter++] = a[l_counter++];
while ( u_counter < u )
aux[aux_counter++] = a[u_counter++];
for ( int i = l, aux_counter = 0; i < u; ++i, ++aux_counter )
a[i] = aux[aux_counter];
}
void sort(int* a, int l, int u) {
if ( u-l > 1 ) {
int m = l+(u-l)/2;
sort(a,l,m);
sort(a,m,u);
merge(a,l,m,u);
}
}
void merge_sort(int* a, int size) {
sort(a,0,size);
}
/*************************************
* Beispielprogramm zur Vorlesung
* Einfuehrung in die Programmierung I
* Andreas Paffenholz
* TU Darmstadt, Wintersemester 2020/21
* (c) 2020-
* Sortieren mit MergeSort
* * Bibliotheksheader zu MergeSort
**************************************/
#ifndef MERGESORT_H
#define MERGESORT_H
void merge_sort(int* , int );
#endif
/*************************************
* Beispielprogramm zur Vorlesung
* Einfuehrung in die Programmierung I
* Andreas Paffenholz
* TU Darmstadt, Wintersemester 2020/21
* (c) 2020-
* Sortieren mit MergeSort
* * Bibliothek zu MergeSort
**************************************/
#include <stdlib.h>
#include "mergesort_gen.h"
void merge(void** a, int l, int m, int u, int (*vgl) (void*, void*)) {
void* aux[u-l];
int l_counter=l, u_counter=m, aux_counter=0;
while ( l_counter < m && u_counter < u) {
if ( vgl(a[l_counter],a[u_counter]) < 0 )
aux[aux_counter++] = a[l_counter++];
else
aux[aux_counter++] = a[u_counter++];
}
while ( l_counter < m )
aux[aux_counter++] = a[l_counter++];
while ( u_counter < u )
aux[aux_counter++] = a[u_counter++];
for ( int i = l, aux_counter = 0; i < u; ++i, ++aux_counter )
a[i] = aux[aux_counter];
}
void sort(void** a, int l, int u, int (*vgl) (void*, void*)) {
if ( u-l > 1 ) {
int m = l+(u-l)/2;
sort(a,l,m, vgl);
sort(a,m,u, vgl);
merge(a,l,m,u, vgl);
}
}
void merge_sort(void** a, int size, int (*vgl) (void*, void*)) {
sort(a,0,size, vgl);
}
/*************************************
* Beispielprogramm zur Vorlesung
* Einfuehrung in die Programmierung I
* Andreas Paffenholz
* TU Darmstadt, Wintersemester 2020/21
* (c) 2020-
* Sortieren mit MergeSort
* * Bibliotheksheader zu MergeSort
**************************************/
#ifndef MERGESORT_H
#define MERGESORT_H
void merge_sort(void** , int, int (*) (void*, void*) );
#endif
/*************************************
* Beispielprogramm zur Vorlesung
* Einfuehrung in die Programmierung I
* Andreas Paffenholz
* TU Darmstadt, Wintersemester 2020/21
* (c) 2020-
* Sortieren mit MergeSort
* * main
*
* Uebersetzen mit
* gcc mergesort_main.c mergesort.c -o mergesort
* Ausfuehren mit
* ./mergesort `cat array.dat`
**************************************/
#include <stdio.h>
#include <stdlib.h>
#include "mergesort.h"
void print_array(int A[], int size) {
for ( int i=0; i < size; i=i+1 ) {
printf("%d ", A[i]);
}
printf("\n");
}
int main(int argc, char** argv) {
int size = argc-1;
int A[size];
for ( int i = 1; i < argc; i=i+1 ) {
A[i-1] = atoi(argv[i]);
}
print_array(A,size);
merge_sort(A,size);
print_array(A,size);
return 0;
}
/*************************************
* Beispielprogramm zur Vorlesung
* Einfuehrung in die Programmierung I
* Andreas Paffenholz
* TU Darmstadt, Wintersemester 2020/21
* (c) 2020-
* Sortieren mit MergeSort
* * main
*
* Uebersetzen mit
* gcc mergesort_main.c mergesort.c -o mergesort
* Ausfuehren mit
* ./mergesort `cat array.dat`
**************************************/
#include <stdio.h>
#include <stdlib.h>
#include "mergesort_gen.h"
int vergleich(void * at, void * bt) {
int * a = (int *)at;
int * b = (int *)bt;
return ( *a > *b ) - ( *b > *a );
}
void print_array(void* A[], int size) {
for ( int i=0; i < size; i=i+1 ) {
printf("%d ", *((int *)A[i]));
}
printf("\n");
}
int main(int argc, char** argv) {
int size = argc-1;
void* A[size];
int AI[size];
for ( int i = 1; i < argc; i=i+1 ) {
AI[i-1] = atoi(argv[i]);
A[i-1] = &AI[i-1];
}
print_array(A,size);
merge_sort(A,size,&vergleich);
print_array(A,size);
return 0;
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment