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