diff --git a/Operations on Datastructures/selectionSortLinkedList.cpp b/Operations on Datastructures/selectionSortLinkedList.cpp new file mode 100644 index 000000000..f2e0a7d1d --- /dev/null +++ b/Operations on Datastructures/selectionSortLinkedList.cpp @@ -0,0 +1,162 @@ +#include +using namespace std; + + +//node defined +class node +{ +public: + int data; + node* link; + node(int d) + { + data = d; + link = NULL; + } + +}; + +//printing the linked list +void print(node* head) +{ + node* current = head; + while (current != NULL) + { + cout << current->data << " "; + current = current-> link; + } + cout << endl; +} + +//creating the linked list with 'n' nodes +node* createlist(int n) +{ + node* head = NULL; + node* t = NULL; + for (int i = 0; i < n; i++) + { + node* temp = NULL; + int num; + cin >> num; + temp = new node(num); + if (head == NULL) + { + head = temp; + t = temp; + continue; + } + if (t->link == NULL) t->link = temp; + t = temp; + } + return head; +} + + +//performing selection sort on the linked list in an iterative manner +void my_selection_sort_linked_list(node* &head) +{ + node* min = head; //throughout the algorithm 'min' is used to denote the node with min value out of all the nodes left for scanning + //while scanning if we find a node 'X' with value lesser than min, + //then we update the pointers in such a way that 'X' becomes the predecessor of 'min' + node* current = min->link; // 'current' refers to the current node we are scanning + node* previous = min; //'previous' refers to the node that is previous to the current node + node* temp = NULL; // 'temp' in this algo is used to point to the last node of the sorted part of the linked list. + //eg. If at any time instance the state of the linked list is suppose 1->2->5->3->8->NULL + //then, we see that "1->2" is the sorted part of the LL, and therefore temp will be pointing to the last node of the sorted part,i.e,'2' + //We keep on arranging the Linked list in such a way that after each iteration the node with 'min' value is placed at its correct position. + //Eg. Let suppose initially we have 5->4->1->3->2->NULL + //After 1st iteration : 1->4->5->3->2->NULL and so on + + while (min->link != NULL) //so that all the nodes are scanned or until there exists a node + { + //pick the first node from the unsorted part and assume that it is the minimum and then start scanning from the next node + + while (current != NULL) //suppose you choose the min node to be X, then scan starts from the (X+1)th node until its NULL. current = (X+1)th node and min = X + { + if (current->data < min->data) //if the current node is smaller than the presumed node 'min' + { + if (temp == NULL) //temp stays null for the first iteration, therefore it symbolizes that we are scanning for the first time + { + if (previous == min) //if the 'previous' is pointing to the 'min' node + { + //Update the pointers + head = current; //update the head pointer with the current node + min->link = current->link; + current->link = previous; + min = current; + current = previous->link; + } + else //if the 'previous' is not pointing to the 'min' node + { + //Update the pointers + head = current; //update the head pointer with the current node + previous->link = current->link; + current->link = min; + min = current; + current = previous->link; + } + } + else //if 'temp' is not NULL, i.e., its not the 1st iteration + { + temp->link = current; + previous->link = current->link; + current->link = min; + min = current; + current = previous->link; + } + } + else //if the current node is greater than min, just move the previous and the current pointer a step further + { + previous = previous->link; + current = current->link; + } + } + + //update the pointers. Set 'temp' to the last node in the sorted part. Make 'min' move a step further so that 'min' points to the 1st node of the unsorted part + //start the iteration again + temp = min; + min = min->link; + previous = min; + current = min->link; + } +} + +// Test cases: + +// enter the no. of nodes : 5 +// 8 9 3 1 4 +// original list is : 8 9 3 1 4 +// sorted list is : 1 3 4 8 9 + +// enter the no. of nodes : 3 +// -1 -2 -3 +// original list is : -1 -2 -3 +// sorted list is : -3 -2 -1 + + +// enter the no. of nodes : 8 +// 8 7 6 5 4 3 2 1 +// original list is : 8 7 6 5 4 3 2 1 +// sorted list is : 1 2 3 4 5 6 7 8 + +// enter the no. of nodes : 6 +// 5 3 4 1 -2 -4 +// original list is : 5 3 4 1 -2 -4 +// sorted list is : -4 -2 1 3 4 5 + + +int main() +{ + node* head = NULL; + int n; + cout << "enter the no. of nodes : "; //taking input from user about the number of nodes in linked list + cin >> n; + if (n == 0) return 0; + head = createlist(n); //creating the list + cout << "original list is : "; + print(head); //printing the original linked list + my_selection_sort_linked_list(head); //applying selection sort + cout << "sorted list is : "; + print(head); //printing the sorted linked list + return 0; +} \ No newline at end of file