From 857c4aafb27f2d1a3db41dd393c90e07a9d656b4 Mon Sep 17 00:00:00 2001 From: Siddhant Swarup Mallick <78552027+siddhant2002@users.noreply.github.com> Date: Thu, 20 Jan 2022 01:05:43 +0530 Subject: [PATCH] Add linked list sorting (#2882) Co-authored-by: Andrii Siriak --- .../thealgorithms/sorts/LinkList_Sort.java | 322 ++++++++++++++++++ .../others/LinkList_Sort_test.java | 64 ++++ 2 files changed, 386 insertions(+) create mode 100644 src/main/java/com/thealgorithms/sorts/LinkList_Sort.java create mode 100644 src/test/java/com/thealgorithms/others/LinkList_Sort_test.java diff --git a/src/main/java/com/thealgorithms/sorts/LinkList_Sort.java b/src/main/java/com/thealgorithms/sorts/LinkList_Sort.java new file mode 100644 index 00000000..24800916 --- /dev/null +++ b/src/main/java/com/thealgorithms/sorts/LinkList_Sort.java @@ -0,0 +1,322 @@ +/** Author : Siddhant Swarup Mallick + * Github : https://github.com/siddhant2002 + */ + +/** Program description - To sort the LinkList as per sorting technique */ + +package com.thealgorithms.sorts; +import java.util.*; +public class LinkList_Sort { + public static boolean isSorted(int p[] , int option) { + try (Scanner sc = new Scanner(System.in)) { + } + int a[] = p; + // Array is taken as input from test class + int b[] = p; + // array similar to a + int ch = option; + // Choice is choosed as any number from 1 to 3 (So the linked list will be sorted by Merge sort technique/Insertion sort technique/Heap sort technique) + switch (ch) { + case 1: + Task nm = new Task(); + Node start = null, prev = null, fresh, ptr; + for (int i = 0; i < a.length; i++) { + // New nodes are created and values are added + fresh = new Node(); // Node class is called + fresh.val = a[i]; // Node val is stored + if (start == null) + start = fresh; + else + prev.next = fresh; + prev = fresh; + } + start = nm.sort_by_mergesort(start); + // method is being called + int i=0; + for (ptr = start;ptr != null; ptr = ptr.next) { + a[i++]=ptr.val; + // storing the sorted values in the array + } + Arrays.sort(b); + // array b is sorted and it will return true when checked with sorted list + LinkList_Sort uu=new LinkList_Sort(); + if(uu.compare(a,b)) + { + return true; + } + else + { + return false; + } + // The given array and the expected array is checked if both are same then true is displayed else false is displayed + case 2: + Node start1 = null, prev1 = null, fresh1, ptr1; + for (int i1 = 0; i1 < a.length; i1++) { + // New nodes are created and values are added + fresh1 = new Node(); // New node is created + fresh1.val = a[i1]; // Value is stored in the value part of the node + if (start1 == null) + start1 = fresh1; + else + prev1.next = fresh1; + prev1 = fresh1; + } + Task1 kk = new Task1(); + start1 = kk.sort_by_insertionsort(start1); + // method is being called + int i1=0; + for (ptr1 = start1; ptr1 != null; ptr1 = ptr1.next) { + a[i1++]=ptr1.val; + // storing the sorted values in the array + } + LinkList_Sort uu1=new LinkList_Sort(); + // array b is not sorted and it will return false when checked with sorted list + if(uu1.compare(a,b)) + { + return true; + } + else + { + return false; + } + // The given array and the expected array is checked if both are same then true is displayed else false is displayed + case 3: + Task2 mm = new Task2(); + Node start2 = null, prev2 = null, fresh2, ptr2; + for (int i2 = 0; i2 < a.length; i2++) { + // New nodes are created and values are added + fresh2 = new Node(); // Node class is created + fresh2.val = a[i2]; // Value is stored in the value part of the Node + if (start2 == null) + start2 = fresh2; + else + prev2.next = fresh2; + prev2 = fresh2; + } + start2 = mm.sort_by_heapsort(start2); + // method is being called + int i3=0; + for (ptr2 = start2; ptr2 != null; ptr2 = ptr2.next) { + a[i3++]=ptr2.val; + // storing the sorted values in the array + } + Arrays.sort(b); + // array b is sorted and it will return true when checked with sorted list + LinkList_Sort uu2=new LinkList_Sort(); + if(uu2.compare(a,b)) + { + return true; + } + else + { + return false; + } + // The given array and the expected array is checked if both are same then true is displayed else false is displayed + default: + // default is used incase user puts a unauthorized value + System.out.println("Wrong choice"); + } + // Switch case is used to call the classes as per the user requirement + return false; + } + boolean compare(int a[] , int b[]) + { + for(int i=0;i= n[i]) + b[k++] = n[i++]; + else + b[k++] = n[j++]; + } + // Smallest number is stored after checking from both the arrays + while (i <= m) { + b[k++] = n[i++]; + } + while (j <= e) { + b[k++] = n[j++]; + } + for (int p = s; p <= e; p++) { + a[p] = b[p - s]; + } + } + // The method task and task1 is used to sort the linklist using merge sort +} +class Task1 { + public Node sort_by_insertionsort(Node head) { + if (head == null || head.next == null) + return head; + int c = count(head); + int a[] = new int[c]; + // Array of size c is created + a[0] = head.val; + int i; + Node ptr; + for (ptr = head.next, i = 1; ptr != null; ptr = ptr.next, i++) { + int j = i - 1; + while (j >= 0 && a[j] > ptr.val) { + // values are stored in the array + a[j + 1] = a[j]; + j--; + } + a[j + 1] = ptr.val; + } + i = 0; + for (ptr = head; ptr != null; ptr = ptr.next) { + ptr.val = a[i++]; + // Value is stored in the linklist after being sorted + } + return head; + } + + static int count(Node head) { + Node ptr; + int c = 0; + for (ptr = head; ptr != null; ptr = ptr.next) { + c++; + } + return c; + // This Method is used to count number of elements/nodes present in the linklist + // It will return a integer type value denoting the number of nodes present + } + // The method task and task1 is used to sort the linklist using insertion sort +} + +class Task2 { + static int a[]; + + public Node sort_by_heapsort(Node head) { + if (head == null || head.next == null) + return head; + int c = count(head); + a = new int[c]; + // Array of size c is created + int i = 0; + for (Node ptr = head; ptr != null; ptr = ptr.next) { + a[i++] = ptr.val; + // values are stored in the array + } + i = 0; + task(a); + for (Node ptr = head; ptr != null; ptr = ptr.next) { + ptr.val = a[i++]; + // Value is stored in the linklist after being sorted + } + return head; + } + + int count(Node head) { + int c = 0; + Node ptr; + for (ptr = head; ptr != null; ptr = ptr.next) { + c++; + } + return c; + // This Method is used to count number of elements/nodes present in the linklist + // It will return a integer type value denoting the number of nodes present + } + + void task(int n[]) { + int k = n.length; + for (int i = k / 2 - 1; i >= 0; i--) { + task1(n, k, i); + } + for (int i = k - 1; i > 0; i--) { + int d = n[0]; + n[0] = n[i]; + n[i] = d; + task1(n, i, 0); + // recursive calling of task1 method + } + } + + void task1(int n[], int k, int i) { + int p = i; + int l = 2 * i + 1; + int r = 2 * i + 2; + if (l < k && n[l] > n[p]) + p = l; + if (r < k && n[r] > n[p]) + p = r; + if (p != i) { + int d = n[p]; + n[p] = n[i]; + n[i] = d; + task1(n, k, p); + } + } + // The method task and task1 is used to sort the linklist using heap sort +} \ No newline at end of file diff --git a/src/test/java/com/thealgorithms/others/LinkList_Sort_test.java b/src/test/java/com/thealgorithms/others/LinkList_Sort_test.java new file mode 100644 index 00000000..758d2532 --- /dev/null +++ b/src/test/java/com/thealgorithms/others/LinkList_Sort_test.java @@ -0,0 +1,64 @@ +package com.thealgorithms.others; +import org.junit.jupiter.api.Test; + +import com.thealgorithms.sorts.LinkList_Sort; + +import static org.junit.jupiter.api.Assertions.*; +public class LinkList_Sort_test { + @Test + void testForOneElement() + { + int a[]={56}; + assertTrue(LinkList_Sort.isSorted(a,2)); + } + + @Test + void testForTwoElements() + { + int a[]={6,4}; + assertTrue(LinkList_Sort.isSorted(a,1)); + } + + @Test + void testForThreeElements() + { + int a[]={875,253,12}; + assertTrue(LinkList_Sort.isSorted(a,3)); + } + + @Test + void testForFourElements() + { + int a[]={86,32,87,13}; + assertFalse(LinkList_Sort.isSorted(a,2)); + } + + @Test + void testForFiveElements() + { + int a[]={6,5,3,0,9}; + assertTrue(LinkList_Sort.isSorted(a,1)); + } + + + @Test + void testForSixElements() + { + int a[]={9,65,432,32,47,327}; + assertTrue(LinkList_Sort.isSorted(a,3)); + } + + @Test + void testForSevenElements() + { + int a[]={6,4,2,1,3,6,7}; + assertTrue(LinkList_Sort.isSorted(a,1)); + } + + @Test + void testForEightElements() + { + int a[]={123,234,145,764,322,367,768,34}; + assertFalse(LinkList_Sort.isSorted(a,2)); + } +}