mramine364

merge sort linked list

Sep 3rd, 2016
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. #include<iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct node
  6. {
  7.     int x;
  8.     node* next;
  9. };
  10.  
  11. void Print(node* r){
  12.     while (r != NULL){
  13.         cout << r->x << ", ";
  14.         r = r->next;
  15.     }cout << endl;
  16. }
  17.  
  18. void Swap(node* a, node* b){
  19.     int t = a->x;
  20.     a->x = b->x;
  21.     b->x = t;
  22. }
  23.  
  24. node* Sort(node* r, int n){ //return the first node
  25.  
  26.     if (n == 1)
  27.         return r;
  28.    
  29.     else if (n == 2){
  30.         if (r->x > r->next->x)
  31.             Swap(r, r->next);
  32.         return r;
  33.     }
  34.  
  35.     bool s1 = true, s2 = true;
  36.     int i = 0;
  37.     node *tr = r, *f, *p;
  38.     while (i<(n-1)/2){
  39.         if (tr->x > tr->next->x)
  40.             s1 = false;
  41.         tr = tr->next;
  42.         i++;
  43.     }  
  44.     tr = tr->next;
  45.     i++;
  46.     int ti = i;
  47.     node* r2 = tr;
  48.     while (ti<n-1){
  49.         if (tr->x > tr->next->x){
  50.             s2 = false;
  51.             break;
  52.         }
  53.         tr = tr->next;
  54.         ti++;
  55.     }
  56.     if (!s1)
  57.         r=Sort(r, i);  
  58.     if (!s2)
  59.         r2=Sort(r2, n - i);
  60.    
  61.     node* first = r;
  62.     f = r;
  63.  
  64.     int ki = 0;
  65.     tr = r;
  66.     while (ki<(n - 1) / 2){
  67.         tr = tr->next;
  68.         ki++;
  69.     }
  70.     p = tr;
  71.  
  72.     ti = i;
  73.     int k = 0;
  74.     while (i < n && k<ti){
  75.         if (r->x > r2->x){
  76.             p->next = r2->next;
  77.             r2->next = r;
  78.             if (f != r){
  79.                 f->next = r2;
  80.                 f = f->next;
  81.             }
  82.             else{
  83.                 first = r2;
  84.                 f = r2;
  85.             }
  86.             r2 = p->next;
  87.             i++;
  88.         }
  89.         else{
  90.             if (r != f)
  91.                 f = f->next;
  92.             r = r->next;           
  93.             k++;
  94.         }
  95.     }
  96.     return first;
  97. }
  98.  
  99.  
  100. int main(){
  101.    
  102.     node* r = new node;
  103.  
  104.     node* tr = r;
  105.     node* pr = r;
  106.     int n = 10,i=0;
  107.     while (i < n){
  108.         tr->x = rand()%100000;
  109.         tr->next = new node;
  110.         pr = tr;
  111.         tr = tr->next;
  112.         i++;
  113.     }
  114.     delete tr;
  115.     pr->next = NULL;
  116.  
  117.     Print(r);
  118.     cout << "start\n";
  119.     r = Sort(r, n);
  120.     cout << "end\n";
  121.     Print(r);
  122.  
  123.     while (r != NULL){
  124.         node* tmp = r;
  125.         r = r->next;
  126.         delete tmp;
  127.     }
  128.  
  129.     getchar();
  130.     return 0;
  131. }
Add Comment
Please, Sign In to add comment