Dada una lista enlazada, la tarea es ordenar la lista enlazada usando HeapSort .
Ejemplos:
Entrada: Lista = 7 -> 698147078 -> 1123629290 -> 1849873707 -> 1608878378 -> 140264035 -> -1206302000
Salida: -1206302000 -> 7 -> 140264035 -> 1123629290 -> 160887878787878Entrada: lista = 7 -> -1075222361 -> -1602192039 -> -1374886644 -> -1007110694 -> -95856765 -> -1739971780
Salida: -1739971780 -> -1602192039 -> -1374886644 -> -10752209071 -> -1 -> -1 > -95856765 -> 7
Enfoque: La idea para resolver el problema usando HeapSort es la siguiente:
Cree una array de tipo Node a partir de LinkedList y use el método heapsort tal como se aplica a las arrays normales. La única diferencia es el uso de un comparador personalizado para comparar los Nodes.
Siga los pasos para resolver el problema:
- Copie los datos de Node de la lista vinculada a una array de tipo Node .
- Ahora use esta array como fuente y ordene los datos usando heapsort como se aplica en el caso de la array.
- Use un comparador personalizado para comparar los Nodes.
- Dado que se está utilizando una array basada en Nodes, el efecto de cambio de datos en realidad estará en LinkedList pero no en la array.
- Finalmente, imprima los datos de la lista enlazada.
A continuación se muestra la implementación del enfoque anterior:
Java
// JAVA program for the above approach: import java.util.Arrays; import java.util.Comparator; import java.util.Random; // Node class to describe // basic node structure class LinkedListNode { int data; LinkedListNode next; LinkedListNode(int data, LinkedListNode node) { this.data = data; next = node; } } public class GFG2 { private static final int SIZE = 7; private static final SortByValueComparator sortByValueComparator = new SortByValueComparator(); // Function to utilise the heapsort public static void heapsort(LinkedListNode node) { LinkedListNode head = node; int i = 0; // Array to copy the linked list data LinkedListNode[] arr = new LinkedListNode[SIZE]; while (head != null) { arr[i++] = head; head = head.next; } sortArray(arr); System.out.println("\nLinkedList after sorting: "); while (node != null) { System.out.print(node.data + " "); node = node.next; } } // Function to sort the array public static void sortArray(LinkedListNode[] arr) { int n = arr.length; // Build heap for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); for (int i = n - 1; i > 0; i--) { // Moving current root to end int temp = arr[0].data; arr[0].data = arr[i].data; arr[i].data = temp; heapify(arr, i, 0); } } // Method that will return a random // LinkedList of size = 6. public static LinkedListNode createLinkedList() { Random random = new Random(); LinkedListNode head = new LinkedListNode(SIZE, null); LinkedListNode node = head; for (int i = SIZE - 1; i > 0; i--) { node.next = new LinkedListNode(random.nextInt(), null); node = node.next; } System.out.println("LinkedList before sorting: "); node = head; while (node != null) { System.out.print(node.data + " "); node = node.next; } return head; } // Function to heapify private static void heapify(LinkedListNode[] arr, int n, int i) { int largest = i; int right = 2 * i + 2; int left = 2 * i + 1; // Check if left child is larger // than root if (left < n && sortByValueComparator.compare(arr[left], arr[largest]) > 0) largest = left; // Check if right child is larger // than the largest till now if (right < n && sortByValueComparator.compare(arr[right], arr[largest]) > 0) largest = right; // Swap if largest is not root if (largest != i) { int swap = arr[i].data; arr[i].data = arr[largest].data; arr[largest].data = swap; // Recursively heapify the subTree heapify(arr, n, largest); } } // Driver code public static void main(String[] args) { LinkedListNode node = createLinkedList(); // Function call heapsort(node); } } // sortByValueComparator implements // Comparator interface to sort the data. // Comparator sort the data on the bases // of returned value as mentioned below. // if return value < 0 that means // node1.data < node2.data // if return value > 0 that means // node1.data > node2.data // if return value = 0 that means // node1.data == node2.data class SortByValueComparator implements Comparator<LinkedListNode> { public int compare(LinkedListNode node1, LinkedListNode node2) { // If we interchange return value // -1 and 1 then LinkedList will be // sorted in reverse/descending order. if (node1.data < node2.data) { return -1; } else if (node1.data > node2.data) { return 1; } return 0; } }
LinkedList before sorting: 7 -126832807 1771004780 1641683278 -179100326 -311811843 1468066971 LinkedList after sorting: -311811843 -179100326 -126832807 7 1468066971 1641683278 1771004780
Complejidad de tiempo: O(N * logN)
Espacio auxiliar: O(1)
Publicación traducida automáticamente
Artículo escrito por himanshubansal07 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA