diff --git a/README b/README index e5798f1..ef280e3 100644 --- a/README +++ b/README @@ -6,3 +6,55 @@ Pour lancer : ./student_rank +## Reponse + +index % time self children called name + +[1] 100.0 0.00 4.03 main [1] +0.01 4.00 1/1 sort_students [2] +0.01 0.00 1/1 generate_ranks [5] +0.00 0.01 1/1 generate_grades [7] +0.00 0.00 2/2 free_array [8] + +--- + + 0.01 4.00 1/1 main [1] + +[2] 99.6 0.01 4.00 1 sort_students [2] +0.81 3.19 1000000/1000000 find_rank_student [3] +0.00 0.00 1000/1001000 bubblesort [4] + +--- + + 0.81 3.19 1000000/1000000 sort_students [2] + +[3] 99.3 0.81 3.19 1000000 find_rank_student [3] +3.19 0.00 1000000/1001000 bubblesort [4] + +--- + + 0.00 0.00 1000/1001000 sort_students [2] + 3.19 0.00 1000000/1001000 find_rank_student [3] + +## [4] 79.2 3.19 0.00 1001000 bubblesort [4] + + 0.01 0.00 1/1 main [1] + +## [5] 0.2 0.01 0.00 1 generate_ranks [5] + + 0.01 0.00 1000/1000 generate_grades [7] + +## [6] 0.1 0.01 0.00 1000 generate_array [6] + + 0.00 0.01 1/1 main [1] + +[7] 0.1 0.00 0.01 1 generate_grades [7] +0.01 0.00 1000/1000 generate_array [6] + +--- + + 0.00 0.00 2/2 main [1] + +## [8] 0.0 0.00 0.00 2 free_array [8] + +On peut voir que le programme perds son temps sur le tri (79.2% du temps d'execution est dédié à l'execution de la fonction de tri). diff --git a/gmon.out b/gmon.out new file mode 100644 index 0000000..e64fb38 Binary files /dev/null and b/gmon.out differ diff --git a/student_rank b/student_rank new file mode 100755 index 0000000..e7cb851 Binary files /dev/null and b/student_rank differ diff --git a/student_rank.c b/student_rank.c index af84003..b938b10 100644 --- a/student_rank.c +++ b/student_rank.c @@ -4,122 +4,101 @@ #include #include #include "heapsort.h" -#include "bubblesort.h" -void generate_grades(int** students_array, int students_number, int grades_number) -{ - int i = 0; - for(i=0;i= 0; i--) - { - if(grades_array[i] == student_grade) - { - position = students_number-i; - break; - } +int find_rank_student(int student_grade, int *grades_array, size_t students_number) { + for (size_t i = 0; i < students_number; i++) { + if (grades_array[i] == student_grade) { + return i + 1; + } } - return position; + return -1; } -void sort_students(int** students_rank, int** students_array, int students_number, int grades_number) -{ - int i = 0, j = 0; - for(i = 0; i < grades_number; i++) - { - int * grades = (int*) malloc(students_number*sizeof(int)); - for(j = 0; j < students_number; j++) - { - grades[j] = students_array[j][i]; - } - bubblesort(grades,students_number); - for(j = 0; j < students_number; j++) - { - students_rank[j][i] = find_rank_student(students_array[j][i],grades,students_number); - } - free(grades); +void sort_students(int **students_rank, int **students_array, size_t students_number, size_t grades_number) { + int *grades = malloc(students_number * sizeof(int)); + int *sorted_grades = malloc(students_number * sizeof(int)); + int *sums = calloc(students_number, sizeof(int)); + + for (size_t i = 0; i < grades_number; i++) { + for (size_t j = 0; j < students_number; j++) { + sums[j] += students_array[j][i]; + grades[j] = sums[j] / (i + 1); + sorted_grades[j] = grades[j]; + } + + heapsort(sorted_grades, students_number); + for (size_t j = 0, k = students_number - 1; j < k; j++, k--) { + int temp = sorted_grades[j]; + sorted_grades[j] = sorted_grades[k]; + sorted_grades[k] = temp; + } + + for (size_t j = 0; j < students_number; j++) { + students_rank[j][i] = find_rank_student(grades[j], sorted_grades, students_number); + } } + + free(grades); + free(sorted_grades); + free(sums); } -int main(int argc, char** argv) -{ - int** student_grades = NULL; - int** student_ranks = NULL; - int students_length = 0; - int grades_length = 0; - int debug_mode = 0; - - if(argc != 4) - { - printf("Usage : %s \n",argv[0]); +int main(int argc, char **argv) { + if (argc != 4) { + printf("Usage : %s \n", argv[0]); return -1; } - students_length = atoi(argv[1]); - grades_length = atoi(argv[2]); - debug_mode = atoi(argv[3]); - student_grades = (int**) malloc(students_length*sizeof(int*)); - student_ranks = (int**) malloc(students_length*sizeof(int*)); - generate_grades(student_grades,students_length,grades_length); - generate_ranks(student_ranks,students_length,grades_length); - - sort_students(student_ranks,student_grades,students_length,grades_length); - - if(debug_mode) - { - print_student_array(student_grades,students_length,grades_length); - print_student_array(student_ranks,students_length,grades_length); + size_t students_length = atoi(argv[1]); + size_t grades_length = atoi(argv[2]); + int debug_mode = atoi(argv[3]); + + int **student_grades = malloc(students_length * sizeof(int *)); + int **student_ranks = malloc(students_length * sizeof(int *)); + generate_grades(student_grades, students_length, grades_length); + generate_ranks(student_ranks, students_length, grades_length); + + sort_students(student_ranks, student_grades, students_length, grades_length); + + if (debug_mode) { + print_student_array(student_grades, students_length, grades_length); + print_student_array(student_ranks, students_length, grades_length); } - free_array(student_grades,students_length); - free_array(student_ranks,students_length); + free_array(student_grades, students_length); + free_array(student_ranks, students_length); free(student_grades); free(student_ranks); return 0; } -