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