Pour parvenir à ce résultat dans la constante de l'espace (mais quadratique du temps), vous pouvez utiliser les deux la le d'attente d'approche en plaçant une file d'attente à chaque extrémité du tableau (similaire à la hollandaise Drapeau National de l'algorithme). Éléments de lecture de gauche à droite : l'ajout d'un élément à gauche de la file d'attente moyen le laisser seul, l'ajout d'un élément à droite de la file d'attente signifie transférer tous les éléments non dans une file d'attente vers la gauche par un, et de placer l'élément ajouté à la fin. Ensuite, pour concaténer les files d'attente, il vous suffit d'inverser l'ordre des éléments dans la seconde file d'attente.
Ce rapport effectue un O(n) opération (déplacement des éléments de la gauche) jusqu'à O(n) fois, ce qui donne un O(n2) temps de fonctionnement.
En utilisant une méthode similaire à la fusion de tri, vous pouvez réduire le temps O(n log n) complexité: découper le tableau en deux moitiés, de manière récursive les trier en fonction de la forme [N P] [N P]
swap le premier P
avec le deuxième N
en O(n) fois (ça devient un peu délicat quand ils n'ont pas exactement la même taille, mais il est toujours linéaire).
Je n'ai absolument aucune idée de comment obtenez ce vers le bas à O(n) fois.
EDIT: en fait, votre liste liée insight est à droite. Si les données sont fournies comme une liste doublement chaînée, vous pouvez mettre en œuvre les deux-file d'attente de stratégie en temps O(n) le temps, O(1) de l'espace:
sort(list):
negative = empty
positive = empty
while (list != empty)
first = pop(list)
if (first > 0)
append(positive,first)
else
append(negative,first)
return concatenate(negative,positive)
Avec une liste chaînée de mise en œuvre qui garde des pointeurs pour les premier et dernier éléments, puis de la pop, de l'ajout et de concaténer sont tous O(1) opérations, de sorte que le total de la complexité est O(n). Comme pour l'espace, aucun des opérations d'allouer de la mémoire (append utilise simplement la mémoire publié par pop), il est donc O(1) dans l'ensemble.