CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet : [C] Partition autour d'un pivot

DébutPage précedente
1
Page suivantePage suivante
ieon_star ieon_star
MP
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 godrik
MP
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 ieon_star
MP
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 godrik
MP
Niveau 22
03 octobre 2015 à 19:37:30

bah aussi

ieon_star ieon_star
MP
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...

Message édité le 03 octobre 2015 à 20:18:56 par ieon_star
godrik godrik
MP
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 ieon_star
MP
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 godrik
MP
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 ieon_star
MP
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 ...

DébutPage précedente
1
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
Infos 0 connecté(s)

Gestion du forum

Modérateurs : godrik, LGV
Contacter les modérateurs - Règles du forum

Sujets à ne pas manquer

La vidéo du moment