forked from menault/TD1_DEV51_Qualite_Algo
version Hugo Raban
This commit is contained in:
76
qiktri.c
Normal file
76
qiktri.c
Normal file
@@ -0,0 +1,76 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user