Quand on travaille avec des tableaux en C et en C++, il est primordial de garder une information en tête: les index commencent à 0.
Cela signifie que si tu as un tableau de N élément, le dernier index valide est N-1
Dés lors, il faut décider de la signification que l'on donne au deuxième paramètre de la fonction:
- Soit, il s'agit du nombre d'éléments qu'il reste à trier,
- Soit il s'agit de la valeur du dernier index valide à tester
Généralement, on optera pour la première solution... Mais cela sous entend que, chaque fois que l'on fera appel à la valeur fournie, l'index correspondant sera cette valeur - 1...
Avant d'écrire la première ligne de code, il est - comme toujours - nécessaire de réfléchir correctement à l'ensemble de ce qui doit être fait...
Il faut commencer par réfléchir aux informations qui doivent être fournies à la fonction, et à ce qu'elle doit renvoyer.
Ce qu'elle doit renvoyer, c'est relativement simple: il s'agit d'un pointeur sur le premier élément du tableau...
Ce qu'il faut lui fournir comme paramètres, ce n'est pas beaucoup plus compliqué:
- un pointeur sur le premier élément du tableau
- le nombre (sous la forme d'un entier - tant qu'à faire - non signé) d'éléments à prendre en compte
Ce qui nous donnera une fonction dont le prototype sera de l'ordre de
int* TriParSelection(int* tab, size_t count)
Comme tu semble d'avis de partir sur une optique récursive, il faut donc réfléchir au cas de base.
Il n'est pas bien compliqué à saisir: s'il n'y a qu'un seul élément à tester, le travail est fini
On partirait donc sur un algorithme dont la base serait
1 2 3 4 5 6 7 8 9
|
int* TriParSelection(int* tab, size_t count)
| SI count = 1
| | renvoie tab
| SINON
| | tri de tab
| | tab <-- TriParSelection(tab, count-1)
| | renvoie tab
| FIN SI |
La logique de la fainéantise nous incitera cependant, étant donné qu'il faut renvoyer tab de toutes manières, à inverser le test, et à transformer l'algorithme en
1 2 3 4 5 6 7
|
int* TriParSelection(int* tab, size_t count)
| SI count <> 1
| | tri de tab
| | tab <--TriParSelection(tab, count-1)
| FIN SI
| renvoie tab |
Mais, il y a toujours une étape qui reste très floue: c'est "tri de tab"...
La question que l'on se posera fatalement, c'est "Comment trier tab"
la réponse tient en une simple boucle et une inversion:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
tri de tab
| @ on décide arbitrairement que l'index auquel se trouve l'élément maxima
| @ est l'index 0
| size_t ind <-- 0
| @ on parcoure le tableau pour trouver le vrai maximum
| Pour i = 0 à count
| | SI tab[i] > tab[ind]
| | | ind <-- i
| | FIN SI
| FIN POUR
| @ et on inverse les deux index
| tab[count - 1] <-- tab[count - 1] XOR tab[ind]
| tab[ind] <-- tab[ind] XOR tab[count - 1]
| tab[count - 1] <-- tab[count - 1] XOR tab[ind] |
En remplaçant "tri de tab" par cette partie d'algorithme, on en arrive à l'algorithme final
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int* TriParSelection(int* tab, size_t count)
| SI count <> 1
| | size_t ind <-- 0
| | Pour i = 0 à count
| | | SI tab[i] > tab[ind]
| | | | ind <-- i
| | | FIN SI
| | FIN POUR
| | tab[count - 1] <-- tab[count - 1] XOR tab[ind]
| | tab[ind] <-- tab[ind] XOR tab[count - 1]
| | tab[count - 1] <-- tab[count - 1] XOR tab[ind]
| | tab <--TriParSelection(tab, count-1)
| FIN SI
| renvoie tab |
Qu'il n'y a plus qu'à traduire en C++... et là, je vais te laisser faire (je t'ai déjà beaucoup trop aidé sur ce coup )
Partager