forked from menault/TD1_DEV51_Qualite_Algo
		
	Téléverser les fichiers vers "/"
Import git
This commit is contained in:
		
							
								
								
									
										80
									
								
								heapsort.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								heapsort.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| // Heapsort Algorithm | ||||
| // M.Menault 2024 | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <time.h> | ||||
|  | ||||
| void print_array(int* array, int length) | ||||
| { | ||||
|     static int count = 0; | ||||
|     int i = 0; | ||||
|     printf("(%3.3d) Array : ",count++); | ||||
|     for(i=0; i < length; i++) | ||||
|     { | ||||
|         printf("%5d ",array[i]); | ||||
|     } | ||||
|     printf("\n"); | ||||
| } | ||||
|  | ||||
| void sift(int* array, int node, int length) | ||||
| { | ||||
|     int largest_node = node; | ||||
|     int left_node = 2*node+1; | ||||
|     int right_node = 2*node+2; | ||||
|     int temp_value = 0; | ||||
|  | ||||
|     if(left_node < length && array[left_node] > array[largest_node]) | ||||
|     { | ||||
|         largest_node = left_node; | ||||
|     } | ||||
|  | ||||
|     if(right_node < length && array[right_node] > array[largest_node]) | ||||
|     { | ||||
|         largest_node = right_node; | ||||
|     } | ||||
|  | ||||
|     if(largest_node != node) | ||||
|     { | ||||
|         temp_value = array[node]; | ||||
|         array[node] = array[largest_node]; | ||||
|         array[largest_node] = temp_value; | ||||
|         sift(array,length,largest_node); | ||||
|     } | ||||
| } | ||||
|   | ||||
| void heapsort(int* array, int length) | ||||
| { | ||||
|     int i = 0; | ||||
|     int temp_value = 0; | ||||
|   | ||||
|     // Sift the current array (binary tree) | ||||
|     for(i=(length/2); i >= 0; i--) | ||||
|     { | ||||
|         sift(array,i,length); | ||||
|     } | ||||
|     // Heapsort ! | ||||
|     for(i=length-1; i > 0; i--) | ||||
|     { | ||||
|         temp_value = array[i]; | ||||
|         array[i] = array[0]; | ||||
|         array[0] = temp_value; | ||||
|         sift(array,0,i); | ||||
|     } | ||||
| } | ||||
|   | ||||
| void generate_array(int* array, int length) | ||||
| { | ||||
|     int i = 0; | ||||
|     static int first_call = 1; | ||||
|  | ||||
|     if(first_call) | ||||
|     { | ||||
| 	first_call = 0; | ||||
|         srand(time(NULL)); | ||||
|     } | ||||
|     for(i=0; i < length; i++) | ||||
|     { | ||||
|         array[i] = rand() % 20 + 1; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										8
									
								
								heapsort.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								heapsort.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| #ifndef __HEAPSORT__ | ||||
| #define __HEAPSORT__ | ||||
|  | ||||
| void heapsort(int* array, int length); | ||||
| void generate_array(int* array, int length); | ||||
| void print_array(int* array, int length); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										124
									
								
								student_rank.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								student_rank.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | ||||
| // Student rank | ||||
| // M.Menault 2024 | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include "heapsort.h" | ||||
|  | ||||
| void generate_grades(int** students_array, int students_number, int grades_number) | ||||
| { | ||||
|     int i = 0; | ||||
|     for(i=0;i<students_number;i++) | ||||
|     { | ||||
| 	students_array[i] = (int*) malloc(grades_number*sizeof(int)); | ||||
|         generate_array(students_array[i],grades_number); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void generate_ranks(int** students_array, int students_number, int grades_number) | ||||
| { | ||||
|     int i = 0; | ||||
|     int j = 0; | ||||
|     for(i=0;i<students_number;i++) | ||||
|     { | ||||
| 	students_array[i] = (int*) malloc(grades_number*sizeof(int)); | ||||
|         for(j=0;j<grades_number;j++) | ||||
| 	{ | ||||
|             students_array[i][j] = -1; | ||||
| 	} | ||||
|     } | ||||
| } | ||||
|  | ||||
| void free_array(int** students_array, int students_number) | ||||
| { | ||||
|     int i = 0; | ||||
|     for(i=0;i<students_number;i++) | ||||
|     { | ||||
|         free(students_array[i]); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void print_student_array(int** students_array, int students_number, int grades_number) | ||||
| { | ||||
|     int i = 0; | ||||
|     printf("----------------------\n"); | ||||
|     for(i=0;i<students_number;i++) | ||||
|     { | ||||
| 	printf("Student %d : ",i); | ||||
|         print_array(students_array[i],grades_number); | ||||
|     } | ||||
|     printf("----------------------\n"); | ||||
| } | ||||
|  | ||||
| int find_rank_student(int student_grade, int* grades_array, int students_number) | ||||
| { | ||||
|     int position = -1; | ||||
|     int i = 0; | ||||
|     heapsort(grades_array,students_number); | ||||
|     for(i = students_number-1; i >= 0; i--) | ||||
|     { | ||||
|         if(grades_array[i] == student_grade) | ||||
| 	{ | ||||
|             position = students_number-i; | ||||
| 	    break; | ||||
| 	} | ||||
|     } | ||||
|     return position; | ||||
| } | ||||
|  | ||||
| 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]; | ||||
| 	} | ||||
|         heapsort(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); | ||||
|     } | ||||
| } | ||||
|  | ||||
| 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 <number of student> <number of grade per student> <debug mode : 0|1>\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); | ||||
|     } | ||||
|  | ||||
|     free_array(student_grades,students_length); | ||||
|     free_array(student_ranks,students_length); | ||||
|     free(student_grades); | ||||
|     free(student_ranks); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user