Comment puis-je trier une liste de 5 entiers de telle sorte que dans le pire des cas, il faut 7 comparaisons? Je me fiche du nombre d'autres opérations qui sont effectuées. Je ne sais rien de particulier sur les entiers.
J'ai essayé différentes approches de division et de conquête qui me ramènent à 8 comparaisons, comme suivre une approche mergesort ou combiner mergesort avec l'utilisation de la recherche binaire pour trouver la position d'insertion, mais chaque fois que je me retrouve avec 8 compare le pire des cas .
En ce moment, je cherche juste un indice, pas une solution.
algorithms
sorting
Robert S. Barnes
la source
la source
if(x > y)
c'est la même chose queif((x - y) & 0x80)
ce qui n'est guère comparable. Je suppose que nous devons oublier que les objets sont des entiers et supposer que nous devons utiliser unecompare(x, y)
fonction magique pour comparer ces objets ...Réponses:
Il n'y a qu'une seule façon de démarrer ce processus (et pour presque toutes vos décisions sur ce qu'il faut comparer dans les étapes ultérieures, il n'y en a qu'une seule correcte). Voici comment le comprendre. Tout d'abord, notez qu'il y a réponses possibles que vous pouvez obtenir pour vos comparaisons, et 5 ! = 120 permutations différentes dont vous devez faire la distinction.27=128 5!=120
La première comparaison est facile: vous devez comparer deux clés, et comme vous ne savez rien à leur sujet, tous les choix sont également bons. Supposons donc que vous compariez et b et que vous trouviez a ≤ b . Il vous reste maintenant 2 6 = 64 réponses possibles, et 60 permutations possibles restantes (puisque nous en avons éliminé la moitié).a b a≤b 26=64 60
Ensuite, nous pouvons soit comparer et d , soit comparer c à l'une des clés que nous avons utilisées dans la première comparaison. Si nous comparons c et d , et apprenons que c ≤c d c c d , alors nous avons 32 réponses restantes et 30 permutations possibles. D'autre part, sion compare c avec un , et nous découvrons que a ≤ c , nous avons 40 permutations possibles restantes, parce que nous avons éliminé 1 / 3 des permutations possibles (ceux avec c ≤c≤d 32 30 c a a≤c 40 1/3 ). Nous n'avons que 32 réponses possibles, nous n'avons donc pas de chance.c≤a≤b 32
Alors maintenant, nous savons que nous devons comparer les première et deuxième clés et les troisième et quatrième clés. Nous pouvons supposer que nous avons et c ≤ da≤b c≤d . Si l' on compare à l' une de ces quatre touches, par le même argument que nous avons utilisé à l'étape précédente, on peut seulement éliminer 1 / 3 des permutations restantes, et nous sommes hors de la chance. Nous devons donc comparer deux des clés a , b , c , d . En tenant compte de la symétrie, nous avons deux choix, comparer a et c ou comparer a et de 1/3 a,b,c,d a c a d . Un argument de comptage similaire montre que nous devons comparer et c . On peut supposer sans perte de généralité que a ≤ c , et maintenant on a a ≤ b et a ≤ c ≤ d .a c a≤c a≤b a≤c≤d
Puisque vous avez demandé un indice, je ne passerai pas en revue le reste de l'argument. Il vous reste quatre comparaisons. Utilisez-les judicieusement.
la source
Vous pouvez le trouver dans The Art of Computer Programming vol III, par D.Knuth, mais la stratégie est la suivante (je suppose que vous avez un tableau ): Si vous voulez lire un indice juste les deux premières lignes de ma réponse{a,b,c,d,e}
Tous les moyens mentionnés ci-dessus sont à l'origine d'au plus trois comparaisons après la première comparaison de avec c . (signifie 7 au maximum).e c
la source