Add linked list sorting (#2882)
Co-authored-by: Andrii Siriak <siryaka@gmail.com>
This commit is contained in:
parent
76fbe7c9e9
commit
857c4aafb2
322
src/main/java/com/thealgorithms/sorts/LinkList_Sort.java
Normal file
322
src/main/java/com/thealgorithms/sorts/LinkList_Sort.java
Normal file
@ -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<a.length;i++)
|
||||||
|
{
|
||||||
|
if(a[i]!=b[i])
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
// Both the arrays are checked for equalness. If both are equal then true is returned else false is returned
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* OUTPUT :
|
||||||
|
* Input - {89,56,98,123,26,75,12,40,39,68,91} is same for all the 3 classes
|
||||||
|
* Output: [12 26 39 40 56 68 75 89 91 98 123] is same for all the 3 classes
|
||||||
|
* 1st approach Time Complexity : O(n logn)
|
||||||
|
* Auxiliary Space Complexity : O(n)
|
||||||
|
* 2nd approach Time Complexity : O(n^2)
|
||||||
|
* Auxiliary Space Complexity : O(n)
|
||||||
|
* 3rd approach Time Complexity : O(n logn)
|
||||||
|
* Auxiliary Space Complexity : O(n)
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
class Node {
|
||||||
|
int val;
|
||||||
|
Node next;
|
||||||
|
// Node class for creation of linklist nodes
|
||||||
|
}
|
||||||
|
|
||||||
|
class Task {
|
||||||
|
static int a[];
|
||||||
|
|
||||||
|
public Node sort_by_mergesort(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, 0, c - 1);
|
||||||
|
// task method will be executed
|
||||||
|
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 i, int j) {
|
||||||
|
if (i < j) {
|
||||||
|
int m = (i + j) / 2;
|
||||||
|
task(n, i, m);
|
||||||
|
task(n, m + 1, j);
|
||||||
|
task1(n, i, m, j);
|
||||||
|
// Array is halved and sent for sorting
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void task1(int n[], int s, int m, int e) {
|
||||||
|
int i = s, k = 0, j = m + 1;
|
||||||
|
int b[] = new int[e - s + 1];
|
||||||
|
while (i <= m && j <= e) {
|
||||||
|
if (n[j] >= 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
|
||||||
|
}
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user