|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Étudiant Inscription : avril 2012 Messages : 3 ![]() |
Bonjour à tous !
J'essaye d'effectuer en langage C, un tri Quicksort : Tri Rapide Au départ j'ai 8 chiffres : 5,3,9,1,8,6,4,7 Le pivot est determiné de façon : prend le premier élément du groupe à trier Donc ici le pivot sera 5 Tout ce qui est inférieur à 5 je veux l'insérer dans un nouveau tableau, et de même pour tout ce qui est supérieur à 5 Ce qui donne un tableau t1 avec 3,1,4 (donc 3 sera le pivot) et un tableau t2 avec 9,8,6,7 (donc le pivot sera 9) Et ainsi de suite .. Jusqu'a ce qu'il y'est que un seul chiffre dans un tableau ou plus aucun dans ce cas la on s'arrête. J'ai commencé à écrire le code mais je suis bloquée concernant le pivot quand il est égal à 5, je n'arrive pas à créer les deux tableaux t1 et t2 Code :
Merci à vous PS: Je suis une débutante qui vient juste de débuter le langage C (c'est mon premier langage , je suis actuellement en 1ère année de BTS Informatique) |
||
|
00
|
|
|
#2 | ||||
|
Expert Confirmé Sénior
![]() ![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 495 ![]() |
Bonjour
Ca ne va pas à plusieurs niveaux
Donc ce genre de mécanisme est tout à fait possible en C mais il implique de connaitre la notion de récursivité. Cette notion part du principe qu'une fonction se déroule dans un espace local et isolé avec ses propres variables. Il lui est donc tout à fait possible d'appeler un clone d'elle-même et attendre le retour de ce clone. Ledit clone effectuant ses propres calculs avec sa propre zone de travail elle-aussi isolée et si besoin, pouvant lui-aussi appeler un autre clone de lui-même et attendre son résultat. Une fois que le clone le plus bas se termine, il renvoie son résultat à son appelant qui peut donc terminer son travail et renvoyer le résultat à son propre appelant et, là encore, ainsi de suite. Exemple de récursivité: la factorielle Code c :
fact(1) étant prévu par le test (qu'on appelle "test de fin de récursivité") renvoie 1 donc fact(2) calcule 2 * 1 et renvoie 2 à fact(3) qui calcule 3 * 2 et renvoie 6 à fact(4) qui calcule 4 * 6 et renvoie 24 à fact(5) qui calcule 5 * 24 et renvoie au final 120 à l'appelant initial. Donc avec un tel exemple c'est une notion pas compliquée à percevoir mais il faut la connaitre avant d'essayer de l'appliquer sur un algorithme plus complexe... PS: un tableau peut se remplir à la déclaration en écrivant: int t[]={5,3,9,1,8,6,4,7}. PS2: la récursivité est un faux ami car s'il simplifie l'écriture de résolution en profondeur, il est super gourmand pour le système (qui doit, quand un clone est appelé, se charger d'empiler le travail en cours pour instancier un nouveau travail). Donc chaque fois qu'on a un problème à résoudre, on essaye d'abord de voir si on peut s'en passer avant de se résoudre à y recourir Exemple de factorielle sans récursivité Code c :
Plus d'infos sur ton algo ici => http://fr.wikipedia.org/wiki/Tri_rapide
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
||||
|
|
20
|
|
|
#3 |
|
Invité de passage
![]() Étudiant Inscription : avril 2012 Messages : 3 ![]() |
Bonsoir,
Tout d'abord merci pour votre réponse très complète et qui m'a été très utile. Cet exercice, je l'effectue de ma propre volonté pour m’entraîner à programmer en C. Mais en effet, je me rend compte qu'au final me manque plusieurs notions avant de pouvoir l'aborder. J'ai bien compris tout ce que vous m'avez expliquer, et je vais étudier sa de très près. Concernant la récursivité, on l'a pas encore traité en cours. Mais je vais y travailler dessus. Avant de repasser à cet exercice, je pense qu'il serait plus judicieux que je fasse d'autres exercices, étape par étape, jusqu'à que j'ai toutes les connaissances pour cet exercice la. Merci pour le lien concernant l'algorithme du tri rapide, maintenant j'ai vraiment bien compris le procédé du tri rapide. Me reste plus qu'à le transcrire en C ! Je vous remercie pour toute votre aide. Bonne soirée à vous |
|
10
|
Copyright © 2000-2013 - www.developpez.com