#define _CRT_NONSTDC_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #include #include #include int MAX; int test_count; double f_selection(int *temp) { clock_t begin, end; int t, c, p, d; double time_spent; begin = clock(); for (c = 0; c < MAX - 1; c++) { p = c; for (d = c + 1; d < MAX; d++) { if (temp[p] > temp[d]) p = d; } if (p != c) { t = temp[c]; temp[c] = temp[p]; temp[p] = t; } } end = clock();// end time_spent = (double)(end - begin) / CLOCKS_PER_SEC;//vypocet casu printf("Selection sort \n"); printf("Time: %.3f \n", time_spent); return time_spent; } double f_insertion(int *temp) { clock_t begin, end; int t, c, d; double time_spent; // premenna na vysledny cas begin = clock();// do premennej begin vlozi pociatocny stav casu for (c = 1; c < MAX; c++) //samotny sort { d = c; while (d > 0 && temp[d] < temp[d - 1]) { t = temp[d]; temp[d] = temp[d - 1]; temp[d - 1] = t; d--; } } end = clock();// do end vlozi konecny cas time_spent = (double)(end - begin) / CLOCKS_PER_SEC;// vypocita samotny cas CLOCKS_PE... je definovany v time.h printf("Insertion sort \n"); printf("Time: %.3f \n", time_spent); return time_spent; } void f_check(int *temp) //Funkcia na kontrolu spravnosti prvkov { int j, wrong; printf("Kontrola:\n"); wrong = 0;// resetnutie WRONG premennej na 0 for (j = 0; j < MAX - 1; j++) // loop na kontrolu celeho temp1 pola { if (temp[j] > temp[j + 1]) { printf("Poradie usporiadanych prvkov nie je spravne, prvok %d nie je mensi ako prvok %d.\n", temp[j], temp[j+1]); wrong++; //ak je nasledujuci prvok mensi ako predchodca napocita wrong cize nakonci nevyhodi, inak } } if (wrong == 0) { printf("Vsetky prvky su spravne zoradene.\n");//ak pocas kontroly nenapocita ani jednu chybu vsetko je ok } else { printf("Celkovy pocet nespravne ulozenych prvkov: %d\n", wrong); system("pause"); } } int main() { printf("Zadaj pocet testov: "); scanf("%d", &test_count); printf("Zadaj maximalny pocet prvkov pola: "); scanf("%d", &MAX); srand(time(NULL)); //generovanie nahodnych cisiel, zavolané pri každom spusteni noveho merania int *data, *temp1, *temp2; int i, j, k; double res, res1, res2; FILE * results; results = fopen("result.txt", "a"); time_t t = time(NULL); struct tm *tm = localtime(&t); char date[64]; strftime(date, sizeof(date), "%c", tm); fprintf(results, "Vysledky testovania sortovacich algoritmov %s pre velkost pola %d\n", date, MAX); res1 = 0; res2 = 0;// vynulovanie Average time pre testy for (k = 0; k < test_count; k++) // samotny loop pre zbiehanie jednotlivych testov { data = malloc(MAX * sizeof(int));// Allokacia miesta pre vstupne data printf("TEST #%d\n", k + 1); fprintf(results, "TEST #%d\n", k + 1); for (i = 0; i < MAX; i++) // Vygenerovanie nahodnych vstupnych dat { data[i] = rand(); // vlozenie do datovej casti } temp1 = malloc(MAX * sizeof(int));// Alokovanie poli pre samotne sorty temp2 = malloc(MAX * sizeof(int)); for (j = 0; j < i; j++) // Loop na prenesenie hodnot do naalokovanych poli prvok po prvku { temp1[j] = data[j]; temp2[j] = data[j]; } res = f_insertion(temp1); //volanie funkcie Insertion Sort fprintf(results, "Insertion Sort: %.4f \n", res);//vypisy konzola viac menej kontrolne, progresove, vypis vysledku do suboru res1 += res; //pripocitavanie vysledneho casu, aby sa mohol vypocitat priemer res = f_selection(temp2); //volanie funkcie Selection sort fprintf(results, "Selection Sort: %.4f \n", res); res2 += res; //pripocitavanie vysledneho casu, aby sa mohol vypocitat priemer f_check(temp1);//volanie funkcie Kontroly s parametrom pre Insertion Sort f_check(temp2);//volanie funkcie Kontroly s parametrom pre Selection Sort } fprintf(results, "Priemerny cas IS: %.4f, SS: %.4f\n\n\n", res1 / k, res2 / k); // vypocet priemeru z casov system("pause"); fclose(results); free(data); free(temp1); free(temp2); return 0; }