Mise en œuvre du sorting par sélection avec des vecteurs

Je tente d’implémenter une fonction qui sortinge un vecteur généré aléatoirement à l’aide du sorting par sélection. J’essaie de manière naïve juste pour voir si je peux le faire fonctionner correctement. Voici ma tentative:

void selection_sort(std::vector& v) { int pos, min, i; //std::vector::iterator pos, min, i; for( pos = v[0]; pos < v[30]; ++pos) { min = pos; for( i = v[pos + 1]; i < v[30]; ++i) { if( i < min) { min = i; } } if( min != pos) { std::swap(v.at(min), v.at(pos)); } } } 

Pour une raison quelconque, cependant, lorsque je réaffiche le vecteur, tous les éléments sont dans le même ordre qu’ils étaient à l’origine. Je ne suis pas sûr si je n’utilise pas std::swap correctement ou si le sorting de ma sélection n’est pas écrit correctement. Je suis sûr que la réponse est sortingvialement facile, mais je ne peux pas la voir. Merci d’avance pour votre aide.

Votre problème est que vous essayez de baser vos boucles sur les valeurs réelles du vecteur, pas sur les index du vecteur.

Donc, si votre vecteur est généré aléatoirement, et que vous dites ceci:

 for( pos = v[0]; pos < v[30]; ++pos) 

Il est possible que la valeur de v [0] soit supérieure à v [30]. Ainsi, la boucle ne fonctionnerait jamais. Je vois le même problème dans cette boucle:

 for( i = v[pos + 1]; i < v[30]; ++i) 

Donc, je vous recommande d'utiliser des index pour le bouclage réel. Essayez quelque chose comme:

 for( pos = 0; pos < 30; ++pos) { min = v[pos]; 

etc...

EDIT: Comme mentionné ci-dessous, il serait également préférable de baser votre boucle sur la taille du vecteur. Cependant, pour éviter de faire appel à la méthode coûteuse size () à chaque exécution de la boucle, il suffit de saisir la taille avant le début de la boucle. Par exemple:

 size_t size = v.size(); for(size_t pos = 0; pos < size; ++pos) 

Vous devez utiliser 0 , pos+1 et v.size() comme points de fin dans vos for boucles.