Programa Javascript para QuickSort en una lista enlazada individualmente

QuickSort en la lista doblemente enlazada se analiza aquí . QuickSort en una lista enlazada individualmente se proporcionó como ejercicio. Las cosas importantes acerca de la implementación son que cambia los punteros en lugar de intercambiar datos y la complejidad del tiempo es la misma que la implementación de la lista doblemente enlazada.

sorting image

En la partición() , consideramos el último elemento como pivote. Recorremos la lista actual y si un Node tiene un valor mayor que el pivote, lo movemos después de la cola. Si el Node tiene un valor menor, lo mantenemos en su posición actual. 

En QuickSortRecur() , primero llamamos a la partición() que coloca el pivote en la posición correcta y devuelve el pivote. Después de colocar el pivote en la posición correcta, encontramos el Node de cola del lado izquierdo (lista antes del pivote) y recurrimos a la lista izquierda. Finalmente, recurrimos a la lista derecha.

Javascript

<script>
// Javascript program for Quick Sort on
// Singly LinKed List
 
// Sort a linked list using quick sort
class Node
{
    constructor(val)
    {
        this.data = val;
        this.next = null;
    }
}
 
var head;
 
function addNode(data)
{
    if (head == null)
    {
        head = new Node(data);
        return;
    }
 
    var curr = head;
    while (curr.next != null)
        curr = curr.next;
 
    var newNode = new Node(data);
    curr.next = newNode;
}
 
function printList(n)
{
    while (n != null)
    {
        document.write(n.data);
        document.write(" ");
        n = n.next;
    }
}
 
// Takes first and last node,
// but do not break any links in
// the whole linked list
function partitionLast(start, end)
{
    if (start == end ||
        start == null ||
        end == null)
        return start;
 
    var pivot_prev = start;
    var curr = start;
    var pivot = end.data;
 
    // Iterate till one before the end,
    // no need to iterate till the end
    // because end is pivot
    while (start != end)
    {
        if (start.data < pivot)
        {
            // Keep tracks of last modified
            // item
            pivot_prev = curr;
            var temp = curr.data;
            curr.data = start.data;
            start.data = temp;
            curr = curr.next;
        }
        start = start.next;
    }
 
    // Swap the position of curr i.e.
    // next suitable index and pivot
    var temp = curr.data;
    curr.data = pivot;
    end.data = temp;
 
    // Return one previous to current
    // because current is now pointing
    // to pivot
    return pivot_prev;
}
 
function sort(start, end)
{
    if (start == null ||
        start == end ||
        start == end.next)
            return;
 
    // Split list and partition recurse
    var pivot_prev = partitionLast(start, end);
    sort(start, pivot_prev);
 
    // If pivot is picked and moved to the start,
    // that means start and pivot is same
    // so pick from next of pivot
    if (pivot_prev != null &&
        pivot_prev == start)
        sort(pivot_prev.next, end);
 
    // If pivot is in between of the list,
    // start from next of pivot,
    // since we have pivot_prev, so we move two nodes
    else if (pivot_prev != null &&
             pivot_prev.next != null)
        sort(pivot_prev.next.next, end);
}
 
// Driver Code
addNode(30);
addNode(3);
addNode(4);
addNode(20);
addNode(5);
 
var n = head;
while (n.next != null)
    n = n.next;
 
document.write(
         "Linked List before sorting<br/>");
printList(head);
 
sort(head, n);
 
document.write(
         "<br/>Linked List after sorting<br/>");
printList(head);
// This code is contributed by umadevi9616
</script>

Producción:

Linked List before sorting 
30 3 4 20 5 
Linked List after sorting 
3 4 5 20 30 

¡ Consulte el artículo completo sobre QuickSort en la lista de enlaces individuales para obtener más detalles!

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *