forked from menault/TD1_DEV51_Qualite_Algo
		
	
		
			
				
	
	
		
			81 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // 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;
 | |
|     }
 | |
| }
 |