Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.78 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. struct node{
  5.     int val;
  6.     node* next;
  7. };
  8.  
  9. node* getTail(node* head){
  10.     while(head != nullptr and head->next != nullptr)
  11.         head = head->next;
  12.     return head;
  13. }
  14.  
  15. node* partition(node* head, node* end, node** newHead, node** newEnd){
  16.    
  17.     node* pivot = end;
  18.     node *prev = nullptr, *cur = head, *tail = pivot;
  19.    
  20.     while(cur != pivot){
  21.         if(cur->val < pivot->val){
  22.             if(*newHead == nullptr)
  23.                 *newHead = cur;
  24.            
  25.             prev = cur;
  26.             cur = cur->next;
  27.         }
  28.         else{
  29.             if(prev)
  30.                 prev->next = cur->next;
  31.             node* tmp = cur->next;
  32.             cur->next = nullptr;
  33.             tail->next = cur;
  34.             tail = cur;
  35.             cur = tmp;
  36.         }
  37.     }
  38.     if(*newHead == nullptr)
  39.         *newHead = pivot;
  40.    
  41.     *newEnd = tail;
  42.    
  43.     return pivot;
  44. }
  45.  
  46. node* quicksortRec(node* head, node* end){
  47.    
  48.     if(!head or head==end)
  49.         return head;
  50.    
  51.     node *newHead = nullptr, *newEnd = nullptr;
  52.     node* pivot = partition(head, end, &newHead, &newEnd);
  53.    
  54.     if(newHead != pivot){
  55.         node *tmp = newHead;
  56.         while(tmp->next != pivot)
  57.             tmp = tmp->next;
  58.         tmp->next = nullptr;
  59.        
  60.         newHead = quicksortRec(newHead, tmp);
  61.        
  62.         tmp = getTail(newHead);
  63.         tmp->next = pivot;
  64.        
  65.     }
  66.    
  67.     pivot->next = quicksortRec(pivot->next, newEnd);
  68.    
  69.     return newHead;
  70. }
  71.  
  72. void quicksort(node** head){
  73.     *head = quicksortRec(*head, getTail(*head));
  74.     return;
  75. }
  76.  
  77. void push(node* &head, int key){
  78.     node* tmp = new node;
  79.     tmp->val = key;
  80.     tmp->next = head;
  81.     head = tmp;
  82. }
  83.  
  84. void push_back(node* &head, int key){
  85.     node* p = new node;
  86.     p->val = key;
  87.     p->next = nullptr;
  88.     if(head == nullptr){
  89.         head = p;
  90.         return;
  91.     }
  92.     node* tmp = head;
  93.     while(tmp->next != nullptr)
  94.         tmp=tmp->next;
  95.    
  96.     tmp->next = p;
  97. }
  98.  
  99.  
  100. node* reverse(node* list) {
  101.  
  102.     node* prev = nullptr;
  103.     node* curr = list;
  104.     node* next = nullptr;
  105.     while(curr != nullptr){
  106.         next = curr->next;
  107.         curr->next = prev;
  108.         prev = curr;
  109.         curr = next;
  110.     }
  111.     return prev;
  112. }
  113.  
  114. void printL(node* head){
  115.     while(head != nullptr){
  116.         cout << head->val << "->";
  117.         head=head->next;
  118.     }
  119. }
  120.  
  121. void swap(node* head, node* one, node* two){
  122.    
  123.     node* prev1 = head;
  124.     node* prev2 = head;
  125.     while(prev1->next != one)
  126.         prev1=prev1->next;
  127.     while(prev2->next != two)
  128.         prev2=prev2->next;
  129.     node* tmp = one->next;
  130.     one->next = two->next;
  131.     two->next = tmp;
  132.     prev1->next = two;
  133.     prev2->next = one;
  134. }  
  135.  
  136. int main(){
  137.     node* list = new node;
  138.     list->val = 10;
  139.     list->next = nullptr;
  140.    
  141.     push(list, 11);
  142.     push(list, 7);
  143.     push(list, 8);
  144.     node* p1 = list;
  145.     push(list, 1);
  146.     push(list, 4);
  147.     push(list, 3);
  148.     node* p2 = list;
  149.     push(list, 5);
  150.     push_back(list, 50);
  151.    
  152.     printL(list);
  153.     swap(list, p1, p2);
  154.     cout<<"\n";
  155.     printL(list);
  156.    
  157.     list = reverse(list);
  158.    
  159.     cout << "\n";
  160.    
  161.     printL(list);
  162.     quicksort(&list);
  163.     cout << "\n";
  164.     printL(list);
  165.     return 0;
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement