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