la mise en œuvre de fusion de tri en C++
J'ai étudié la théorie de la fusion de tri mais n'ont pas la moindre idée de la façon de l'implémenter en C++. Ma question est, sorte de fusion crée des tableaux à la récursivité. Mais lors de la mise en œuvre, comment pouvons-nous créer des tableaux dans runtime? ou qu'est-ce que l'approche générale de cette?
Grâce.
En fait, l'avantage de la fusion de tri, c'est qu'il n'a pas besoin de tableaux dans la première place. En fait, la fusion de tri peut être mis en place, en utilisant des séquences avec d'assez faibles exigences (je pense que vous pouvez la mettre en œuvre sur les itérateurs). Jetez un oeil à
"Runtime", pas "en temps réel".
Qu'est-ce que
algorithmist.com/index.php/Merge_sort.cpp
Il y a un
std::merge_sort()
!"Runtime", pas "en temps réel".
Qu'est-ce que
std::merge_sort
? Avez-vous peut-être dire std::stable_sort
?algorithmist.com/index.php/Merge_sort.cpp
Il y a un
std::inplace_merge
algorithme que j'ai utilisé pour mettre en œuvre fusion de tri.OriginalL'auteur Maduranga E | 2012-08-19
Vous devez vous connecter pour publier un commentaire.
Basé sur le code ici: http://cplusplus.happycodings.com/algorithms/code17.html
<iostream.h>
?!?! Sûrement, vous plaisantez! Cet en-tête est sorti de l'usage de plus d'une décennie! Pour ne pas mentionner l'utilisation d'une variable globale etmain()
retourvoid
. Quelle que soit la source de cette information, il est probablement préférable de laisser seul...!Vous avez raison, bien sûr. Mais guy a demandé sur les tableaux et la récursivité. Vous l'avez ici. Et vous pouvez trouver la source de ma réponse.
Mais je fixe iostream et le principal:)
Eh bien, de fusion, le tri est clairement récursive. Cependant, il n'a certainement pas besoin de tableaux. Il n'a pas besoin de mémoire supplémentaire soit bien en place, la fusion n'est pas tout à fait triviaux (je pense, ce que je pouvais venir immédiatement, c'est assez facile, mais pas d'une simple boucle).
Bien sûr, il suffit de retirer
.h
n'est pas suffisante, car maintenant le code ne compile pas! Vous auriez besoin d'unusing namesspace std;
directive.OriginalL'auteur klm123
Pour répondre à la question: Créer dynamiquement la taille des tableaux au moment de l'exécution se fait à l'aide de
std::vector<T>
. Idéalement, vous devez obtenir votre entrée à l'aide de l'un de ces. Si pas, il est facile de les convertir. Par exemple, vous pouvez créer deux tableaux comme ceci:Toutefois, l'allocation dynamique de tableaux est relativement lente et doit généralement être évitée lorsque cela est possible. Pour les fusion, vous pouvez juste une sorte de sous-séquences du tableau d'origine et de les fusionner. Il semble,
std::inplace_merge()
demande pour les itérateurs bidirectionnels.OriginalL'auteur Dietmar Kühl
J'ai terminé @DietmarKühl s mode de fusion de tri. Espérons que cela aide tous.
Dans d'autres implémentations de fusion de tri, le
k
l'index serait utilisé pour garder la trace du point d'insertion pour le plus grand tableau. Dans cette mise en œuvre, il n'est pas nécessaire puisque vous êtes "à repousser/ajout" des articles de la plus petite des tableaux dans le plus gros.OriginalL'auteur Sazzad Hissain Khan
J'ai réarrangé la réponse choisie, utilisé des pointeurs pour les tableaux et la saisie de l'utilisateur pour le numéro de compte n'est pas pré-définis.
OriginalL'auteur emrahgunduz
OriginalL'auteur João Abrantes
Je sais que cette question a déjà été posée, mais j'ai décidé d'ajouter mon grain de sel. Voici le code pour une fusion de sorte que seules les utilisations de l'espace supplémentaire dans l'opération de fusion (et que l'espace supplémentaire est espace temporaire qui sera détruit lorsque la pile est sorti). En fait, vous allez voir dans ce code il n'y a pas d'utilisation des tas d'opérations (pas de déclarer
new
n'importe où).Espère que cette aide.
OriginalL'auteur Barry Steyn
Voici une manière de le mettre en œuvre, en utilisant seulement des tableaux.
OriginalL'auteur KKP
Le problème avec la fusion de tri est la fusion, si vous n'avez pas réellement besoin de mettre en œuvre la fusion, alors il est assez simple (pour un vecteur d'entiers):
b
,m
ete
ne sont pas explicites. Tu veux dire:begin
,middle
etend
OriginalL'auteur Mac
Ce serait facile à comprendre:
OriginalL'auteur theCaveman