Files
TD1_DEV51_Qualite_Algo/qiktri.c
2025-09-10 17:25:08 +02:00

76 lines
1.7 KiB
C

#include "qiktri.h"
static void insertion_sort(int* array, int low, int high)
{
for (int i = low + 1; i <= high; i++)
{
int key = array[i];
int j = i - 1;
while (j >= low && array[j] > key)
{
array[j + 1] = array[j];
j--;
}
array[j + 1] = key;
}
}
static int partition_qiktri(int* array, int low, int high)
{
int mid = low + (high - low) / 2;
// médiane de trois pour choisir un bon pivot
if (array[mid] < array[low]) {
int tmp = array[mid]; array[mid] = array[low]; array[low] = tmp;
}
if (array[high] < array[low]) {
int tmp = array[high]; array[high] = array[low]; array[low] = tmp;
}
if (array[mid] < array[high]) {
int tmp = array[mid]; array[mid] = array[high]; array[high] = tmp;
}
int pivot = array[high];
int i = low - 1;
for (int j = low; j < high; j++)
{
if (array[j] <= pivot)
{
i++;
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
int temp = array[i + 1];
array[i + 1] = array[high];
array[high] = temp;
return i + 1;
}
void qiktri(int* array, int low, int high) // ⬅️ plus de "static"
{
while (low < high)
{
if (high - low < 16)
{
insertion_sort(array, low, high);
break;
}
int pi = partition_qiktri(array, low, high);
if (pi - low < high - pi)
{
qiktri(array, low, pi - 1);
low = pi + 1;
}
else
{
qiktri(array, pi + 1, high);
high = pi - 1;
}
}
}