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