Se connecter

Informatique

Programmation

Sujet : [C] Partition autour d'un pivot
1
ieon_star
Niveau 9
03 octobre 2015 à 19:25:53

Bonjour, je cherche à créer une fonction qui partitionne une suite de valeur en mémoire autour d'un pivot pour ensuite implanter la fonction standard quick_sort. Mais mes premiers tests m'affichent des valeurs inattendues (de très grands nombres ou des 0).

J'ai vraiment du mal à repérer mon erreur, merci d'avance pour vos réponses :)

Voici mon code pour la fonction:

void *partition_pivot(void *base, size_t nmemb, size_t size,
    int (*compar)(const void *, const void *)) {
  if (size == 0 || nmemb == 0) {
    return NULL;
  }
  char *k = (char *)base + (nmemb - 1) * size;
  char *p = (char *)base;
  char *q = (char *)base;
  while (q < k) {
    if (compar(q, k) < 0) {
      mem_swap(p, q, size);
      ++p;
    }
    ++q;
  }
  mem_swap(p, k, size);
  return p;
}
godrik
Niveau 22
03 octobre 2015 à 19:29:19

c'est pas ++p que tu veux. c'est p+=size;

PS: Qu'est ce que c'est moche du C.

ieon_star
Niveau 9
03 octobre 2015 à 19:34:50

merci beaucoup ! ça a l'air de marcher :)
Mais dans ce cas pourquoi pas q += size ? :question:

godrik
Niveau 22
03 octobre 2015 à 19:37:30

bah aussi

ieon_star
Niveau 9
03 octobre 2015 à 20:17:29

Oui, c'est logique :noel: , c'est juste que bizarrement ça semblait fonctionner sans avoir modifié l'affecation à q :hap:.
Enfin bref, du coup j'en suis au quick_sort, mais je n'arrive pas à déterminer ce que j'envoie comme nmemb dans les 2 appels récursifs :

void quick_sort(void *base, size_t nmemb, size_t size,
    int (*compar)(const void *, const void *)) {
  char *j = (char *)base;
  char *k = (char *)base + (nmemb - 1) * size;
  char *p;
  while (j < k) {
    p = partition_pivot(j, nmemb, size, compar);
    printf("%p\n", p);
    if (p - j < k - p) {
      quick_sort(j, ???, size, compar);
      j = p + size;
    }else{
      quick_sort(p + size, ???, size, compar);
      k = p - size;
    }
  }
}

Naturellement je pense à (p - j) / size et (k - p) / size mais apparemment ce n'est pas ça (ma boucle tourne à l'infini) à moins que je me trompe autre part...

godrik
Niveau 22
03 octobre 2015 à 20:21:18

deroule un exemple a la main, c'est ce qu'il y a de plus simple pour trouver ce genre de truc.

ieon_star
Niveau 9
03 octobre 2015 à 20:54:02

Alors là par contre j'ai un vrai problème, j'ai testé le retour de la fonction de partition avec un:
printf("%d", *p)
juste avant de retourner p, et en fait la fonction renvoie la plus grande valeur du tableau, et non le pivot :ouch2:

godrik
Niveau 22
03 octobre 2015 à 21:01:54

fais attention. les types dans printf ne matchent pas, *p c'est un char, et %d ca denote un entier. deroule tes fonctions a la main et tu devrais voir ce qu'il se passe.

ieon_star
Niveau 9
03 octobre 2015 à 21:59:47

Bon je crois que je vais abandonner :rire:, j'ai tout essayé, y compris dérouler à la main (à la main ça semble fonctionner) mais plus le temps passe et moins j'arrive à réfléchir, c'est horrible :rire:
Quoi que je fasse, le programme ne s'arrête pas, j'ai l"impression de passer à côté d'un trucs grotesque ça m'énerve tellement ...

1
Sujet : [C] Partition autour d'un pivot
News culture
La Planète des Singes : Le Nouveau Royaume - la révolution simienne est en marche !
   Retour haut de page
Consulter la version web de cette page