#include #include #include #include #include #if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__) #define OS_WIN #include #endif #define RMAX 1000 /*#define CLK_TCK 1000*/ unsigned long int bubble_swap_count=0, ins_swap_count=0, sel_swap_count=0, merge_swap_count=0; unsigned long int bubble_comp_count=0, ins_comp_count=0, sel_comp_count=0, merge_comp_count=0; double bubble_time, ins_time, sel_time, merge_time; short int bubble_rev_dir=0, ins_rev_dir=0, sel_rev_dir=0, merge_rev_dir=0; short int goto_line=5; void pause ( int ms ) { clock_t endwait; endwait = clock () + ms ; while (clock() < endwait) {} } clock_t BeginTimer() { //timer declaration clock_t Begin; //initialize Begin //Begin = clock() * CLK_TCK; //start the timer Begin = clock(); //start the timer //printf("\n--BEGIN:%.2f--",(double)Begin); return Begin; } clock_t EndTimer(double begin) { //double End; clock_t End; //End = clock() * CLK_TCK; //stop the timer End = clock(); //stop the timer //printf("\n--END:%.2f--\n",(double)End); return End-begin; } /* fuelle array mit zufaelligen Werten (< RMAX) */ static void fill_array_int(int arr[], int n) { int i; for (i = 0; i < n; i++) arr[i] = rand() % RMAX; } static void fill_array_float(float arr[], int n) { int i; for (i = 0; i < n; i++) arr[i] = (rand()/(float)((RAND_MAX)+1)) * RMAX; } static void fill_array_double(double arr[], int n) { int i; for (i = 0; i < n; i++) arr[i] = (rand()/((double)(RAND_MAX+1))) * RMAX; } /* tausche den Inhalt zweier Variablen */ static void swap_int(int *a, int *b) { int tmp; tmp = *a; *a = *b; *b = tmp; } static void swap_float(float *a, float *b) { float tmp; tmp = *a; *a = *b; *b = tmp; } static void swap_double(double *a, double *b) { double tmp; tmp = *a; *a = *b; *b = tmp; } /********************* BUBBLE SORT ***********************/ /*-------------------BUBBLE INTEGER--------------------*/ static void bubble_sort_int(int arr[], int length) { double begin = BeginTimer(); int i, swapped; bubble_time = 0; bubble_swap_count = 0; do { swapped = 0; if (bubble_rev_dir) { for (i = 1; i < length; i++) { bubble_comp_count++; if (arr[i - 1] < arr[i]) { swap_int(&arr[i - 1], &arr[i]); bubble_swap_count++; swapped = 1; } } } else { for (i = 1; i < length; i++) { bubble_comp_count++; if (arr[i - 1] > arr[i]) { swap_int(&arr[i - 1], &arr[i]); bubble_swap_count++; swapped = 1; } } } } while (swapped); bubble_time = EndTimer(begin); } /*-------------------BUBBLE FLOAT--------------------*/ static void bubble_sort_float(float arr[], int length) { double begin = BeginTimer(); int i, swapped; bubble_time = 0; bubble_swap_count = 0; do { swapped = 0; if (bubble_rev_dir) { for (i = 1; i < length; i++) { bubble_comp_count++; if (arr[i - 1] < arr[i]) { swap_float(&arr[i - 1], &arr[i]); bubble_swap_count++; swapped = 1; } } } else { for (i = 1; i < length; i++) { bubble_comp_count++; if (arr[i - 1] > arr[i]) { swap_float(&arr[i - 1], &arr[i]); bubble_swap_count++; swapped = 1; } } } } while (swapped); bubble_time = EndTimer(begin); } /*-------------------BUBBLE DOUBLE--------------------*/ static void bubble_sort_double(double arr[], int length) { double begin = BeginTimer(); int i, swapped; bubble_time = 0; bubble_swap_count = 0; do { swapped = 0; if (bubble_rev_dir) { for (i = 1; i < length; i++) { bubble_comp_count++; if (arr[i - 1] < arr[i]) { swap_double(&arr[i - 1], &arr[i]); bubble_swap_count++; swapped = 1; } } } else { for (i = 1; i < length; i++) { bubble_comp_count++; if (arr[i - 1] > arr[i]) { swap_double(&arr[i - 1], &arr[i]); bubble_swap_count++; swapped = 1; } } } } while (swapped); bubble_time = EndTimer(begin); } /*\\\\\\\\\\\\\\\\\\ END BUBBLE SORT ///////////////////*/ /********************* INSERTION SORT ***********************/ /*--------------------INSERTION INTEGER---------------------*/ static void insertion_sort_int(int arr[], int length) { double begin = BeginTimer(); int i, j, key; ins_time = 0; ins_swap_count = 0; if (ins_rev_dir) { for (i = 1; i < length; i++) { key = arr[i]; j = i - 1; ins_comp_count++; while (j >= 0 && key > arr[j]) { ins_swap_count++; arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } } else { for (i = 1; i < length; i++) { key = arr[i]; j = i - 1; ins_comp_count++; while (j >= 0 && key < arr[j]) { ins_swap_count++; arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } } ins_time = EndTimer(begin); } /*------------------INSERTION FLOAT--------------------*/ static void insertion_sort_float(float arr[], int length) { double begin = BeginTimer(); int i, j; float key; ins_time = 0; ins_swap_count = 0; if (ins_rev_dir) { for (i = 1; i < length; i++) { key = arr[i]; j = i - 1; ins_comp_count++; while (j >= 0 && key > arr[j]) { ins_swap_count++; arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } } else { for (i = 1; i < length; i++) { key = arr[i]; j = i - 1; ins_comp_count++; while (j >= 0 && key < arr[j]) { ins_swap_count++; arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } } ins_time = EndTimer(begin); } /*------------------INSERTION DOUBLE--------------------*/ static void insertion_sort_double(double arr[], int length) { double begin = BeginTimer(); int i, j; double key; ins_time = 0; ins_swap_count = 0; if (ins_rev_dir) { for (i = 1; i < length; i++) { key = arr[i]; j = i - 1; ins_comp_count++; while (j >= 0 && key > arr[j]) { ins_swap_count++; arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } } else { for (i = 1; i < length; i++) { key = arr[i]; j = i - 1; ins_comp_count++; while (j >= 0 && key < arr[j]) { ins_swap_count++; arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } } ins_time = EndTimer(begin); } /*\\\\\\\\\\\\\\\\\\ END INSERTION SORT ///////////////////*/ /********************* SELECTION SORT ***********************/ /*-------------------SELECTION INTEGER--------------------*/ static void selection_sort_int(int arr[], int length) { double begin = BeginTimer(); int i, j, min, max; sel_time = 0; sel_swap_count = 0; if (sel_rev_dir) { for (i = 0; i < length - 1; i++) { max = i; for (j = i + 1; j < length; j++) { sel_comp_count++; if (arr[j] > arr[max]) max = j; } swap_int(&arr[i], &arr[max]); sel_swap_count++; } } else { for (i = 0; i < length - 1; i++) { min = i; for (j = i + 1; j < length; j++) { sel_comp_count++; if (arr[j] < arr[min]) min = j; } swap_int(&arr[i], &arr[min]); sel_swap_count++; } } sel_time = EndTimer(begin); } /*------------------SELECTION FLOAT--------------------*/ static void selection_sort_float(float arr[], int length) { double begin = BeginTimer(); int i, j, min, max; sel_time = 0; sel_swap_count = 0; if (sel_rev_dir) { for (i = 0; i < length - 1; i++) { max = i; for (j = i + 1; j < length; j++) { sel_comp_count++; if (arr[j] > arr[max]) max = j; } swap_float(&arr[i], &arr[max]); sel_swap_count++; } } else { for (i = 0; i < length - 1; i++) { min = i; for (j = i + 1; j < length; j++) { sel_comp_count++; if (arr[j] < arr[min]) min = j; } swap_float(&arr[i], &arr[min]); sel_swap_count++; } } sel_time = EndTimer(begin); } /*------------------SELECTION DOUBLE--------------------*/ static void selection_sort_double(double arr[], int length) { double begin = BeginTimer(); int i, j, min, max; sel_time = 0; sel_swap_count = 0; if (sel_rev_dir) { for (i = 0; i < length - 1; i++) { max = i; for (j = i + 1; j < length; j++) { sel_comp_count++; if (arr[j] > arr[max]) max = j; } swap_double(&arr[i], &arr[max]); sel_swap_count++; } } else { for (i = 0; i < length - 1; i++) { min = i; for (j = i + 1; j < length; j++) { sel_comp_count++; if (arr[j] < arr[min]) min = j; } swap_double(&arr[i], &arr[min]); sel_swap_count++; } } sel_time = EndTimer(begin); } /*\\\\\\\\\\\\\\\\ END SELECTION SORT /////////////////*/ /********************* MERGE SORT ***********************/ /*--------------------MERGE INTEGER---------------------*/ /* Fuege (merge) zwei sortierte Partitionen zusammen */ static void merge_int(int arr[], int l, int m, int r) { int *tmp = (int *) malloc(sizeof(int) * (m - l + 1)); int i, j = 0, k = m + 1; merge_swap_count = 0; /* kopiere arr[l..m] in ein temporaeres Array */ for (i = l; i <= m; i++) tmp[j++] = arr[i]; /* vergleiche die Eintraege des temp. Arrays mit den Eintraegen arr[m+1..r] */ i = l; j = 0; while (i < k && k <= r) { merge_comp_count++; if (tmp[j] <= arr[k]) { arr[i++] = tmp[j++]; merge_swap_count++; } else { arr[i++] = arr[k++]; merge_swap_count++; } } /* kopiere eventuelle vorhandene Eintraege des temp. Arrays nach arr */ while (i < k) { arr[i++] = tmp[j++]; merge_swap_count++; } free(tmp); } /* merge-sort */ static void merge_sorter_int(int arr[], int l, int r) { int m = (l + r) / 2; /* arr[l..r] hat min. zwei Elemente <=> l < r */ if (l < r) { /* sortiere ersten Teil */ merge_sorter_int(arr, l, m); /* sortiere zweiten Teil */ merge_sorter_int(arr, m + 1, r); /* Fuege sortierte Teile zusammen */ merge_int(arr, l, m, r); } } /* Wrapper für mergesorter */ static void merge_sort_int(int arr[], int n) { merge_time = 0; double begin = BeginTimer(); merge_sorter_int(arr, 0, n - 1); merge_time = EndTimer(begin); } /*--------------------MERGE FLOAT---------------------*/ /* Fuege (merge) zwei sortierte Partitionen zusammen */ static void merge_float(float arr[], int l, int m, int r) { float *tmp = (float *) malloc(sizeof(float) * (m - l + 1)); int i, j = 0, k = m + 1; merge_swap_count = 0; /* kopiere arr[l..m] in ein temporaeres Array */ for (i = l; i <= m; i++) tmp[j++] = arr[i]; /* vergleiche die Eintraege des temp. Arrays mit den Eintraegen arr[m+1..r] */ i = l; j = 0; while (i < k && k <= r) { merge_comp_count++; if (tmp[j] <= arr[k]) { arr[i++] = tmp[j++]; merge_swap_count++; } else { arr[i++] = arr[k++]; merge_swap_count++; } } /* kopiere eventuelle vorhandene Eintraege des temp. Arrays nach arr */ while (i < k) { arr[i++] = tmp[j++]; merge_swap_count++; } free(tmp); } /* merge-sort */ static void merge_sorter_float(float arr[], int l, int r) { int m = (l + r) / 2; /* arr[l..r] hat min. zwei Elemente <=> l < r */ if (l < r) { /* sortiere ersten Teil */ merge_sorter_float(arr, l, m); /* sortiere zweiten Teil */ merge_sorter_float(arr, m + 1, r); /* Fuege sortierte Teile zusammen */ merge_float(arr, l, m, r); } } /* Wrapper für mergesorter */ static void merge_sort_float(float arr[], int n) { merge_time = 0; double begin = BeginTimer(); merge_sorter_float(arr, 0, n - 1); merge_time = EndTimer(begin); } /*--------------------MERGE DOUBLE---------------------*/ /* Fuege (merge) zwei sortierte Partitionen zusammen */ static void merge_double(double arr[], int l, int m, int r) { double *tmp = (double *) malloc(sizeof(double) * (m - l + 1)); int i, j = 0, k = m + 1; merge_swap_count = 0; /* kopiere arr[l..m] in ein temporaeres Array */ for (i = l; i <= m; i++) tmp[j++] = arr[i]; /* vergleiche die Eintraege des temp. Arrays mit den Eintraegen arr[m+1..r] */ i = l; j = 0; while (i < k && k <= r) { merge_comp_count++; if (tmp[j] <= arr[k]) { arr[i++] = tmp[j++]; merge_swap_count++; } else { arr[i++] = arr[k++]; merge_swap_count++; } } /* kopiere eventuelle vorhandene Eintraege des temp. Arrays nach arr */ while (i < k) { arr[i++] = tmp[j++]; merge_swap_count++; } free(tmp); } /* merge-sort */ static void merge_sorter_double(double arr[], int l, int r) { int m = (l + r) / 2; /* arr[l..r] hat min. zwei Elemente <=> l < r */ if (l < r) { /* sortiere ersten Teil */ merge_sorter_double(arr, l, m); /* sortiere zweiten Teil */ merge_sorter_double(arr, m + 1, r); /* Fuege sortierte Teile zusammen */ merge_double(arr, l, m, r); } } /* Wrapper für mergesorter */ static void merge_sort_double(double arr[], int n) { merge_time = 0; double begin = BeginTimer(); merge_sorter_double(arr, 0, n - 1); merge_time = EndTimer(begin); } /*\\\\\\\\\\\\\\\\\\ END MERGE SORT ///////////////////*/ static void any_key_wait() { char cc; printf("\n ...Press Any Key To Exit... \n"); do { cc = getch(); } while(!cc); } /* ueberpruefe, ob ein Array sortiert ist (zum Debuggen) */ static void check_sort_int(int arr[], int n, int DESC) { int i; for (i = 1; i < n; i++) if (DESC) { if (arr[i - 1] < arr[i]) { fprintf(stderr, "internal sort algorithm error\n"); exit(EXIT_FAILURE); } } else { if (arr[i - 1] > arr[i]) { fprintf(stderr, "internal sort algorithm error\n"); exit(EXIT_FAILURE); } } } static void check_sort_float(float arr[], int n, int DESC) { int i; for (i = 1; i < n; i++) if (DESC) { if (arr[i - 1] < arr[i]) { fprintf(stderr, "internal sort algorithm error\n"); exit(EXIT_FAILURE); } } else { if (arr[i - 1] > arr[i]) { fprintf(stderr, "internal sort algorithm error\n"); exit(EXIT_FAILURE); } } } static void check_sort_double(double arr[], int n, int DESC) { int i; for (i = 1; i < n; i++) if (DESC) { if (arr[i - 1] < arr[i]) { fprintf(stderr, "internal sort algorithm error\n"); exit(EXIT_FAILURE); } } else { if (arr[i - 1] > arr[i]) { fprintf(stderr, "internal sort algorithm error\n"); exit(EXIT_FAILURE); } } } static void usage_and_exit(char *prgname) { /*printf("usage: %s (bubble|insertion|merge|selection) SIZE [desc] [print]\n", prgname); printf("---------\n-Ascending sort is default sort order, add 'desc' parameter if you\nwant descending order.\n"); printf("-If you want to view (print to screen) sorted array add 'print' parameter.\n Not recommended for large arrays\n"); */ printf("usage: %s SIZE\n", prgname); exit(EXIT_FAILURE); } static void print_array_int(int arr[], int size) { int i; printf("\nSorted array:\n"); for(i=0;i