Vous devez vous connecter pour exécuter votre code.
Tri polymorphe (qsort-like)
B 10.5 — Implémentez la fonction merge_sort qui trie un tableau générique, sur le modèle de qsort. Utilisez memcpy de .
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void merge(void *base, size_t lo, size_t mid, size_t hi, size_t size,
int (*compar)(const void *, const void *)) {
size_t n1 = mid - lo + 1, n2 = hi - mid;
void *left = malloc(n1 * size), *right = malloc(n2 * size);
memcpy(left, (char*)base + lo*size, n1*size);
memcpy(right, (char*)base + (mid+1)*size, n2*size);
size_t i = 0, j = 0, k = lo;
while (i < n1 && j < n2) {
if (compar((char*)left+i*size, (char*)right+j*size) <= 0)
memcpy((char*)base+k*size, (char*)left+i*size, size), i++;
else
memcpy((char*)base+k*size, (char*)right+j*size, size), j++;
k++;
}
while (i < n1) memcpy((char*)base+k*size, (char*)left+i*size, size), i++, k++;
while (j < n2) memcpy((char*)base+k*size, (char*)right+j*size, size), j++, k++;
free(left); free(right);
}
static void merge_sort_r(void *base, size_t lo, size_t hi, size_t size,
int (*compar)(const void *, const void *)) {
if (lo < hi) {
size_t mid = lo + (hi - lo) / 2;
merge_sort_r(base, lo, mid, size, compar);
merge_sort_r(base, mid + 1, hi, size, compar);
merge(base, lo, mid, hi, size, compar);
}
}
void merge_sort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *)) {
if (nmemb > 1) merge_sort_r(base, 0, nmemb - 1, size, compar);
}
int main() {
int n;
scanf("%d", &n);
int arr[1000];
for (int i = 0; i < n; i++) scanf("%d", &arr[i]);
merge(arr, n);
return 0;
}