Advertisement
Guest User

sort

a guest
Nov 27th, 2015
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.02 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5. /*
  6. void merge(int *a, int left, int mid, int right)
  7. {
  8.     int *LeftBuf = (int*)malloc(sizeof(int)*(mid - left+1));
  9.     int *RightBuf = (int*)malloc(sizeof(int)*(right - mid));
  10.     int i, j=0;
  11.     int k = left;
  12.     for (i = 0; i < mid - left+1; i++)
  13.     {
  14.         LeftBuf[i] = a[i + left]; //заполняется левый буферный массив из исходного
  15.     }
  16.     for (i = 0; i <= right - mid-1; i++)
  17.     {
  18.         RightBuf[i] = a[i + mid+1]; //заполняется левый буферный массив из исходного
  19.     }
  20.     i = 0;
  21.     while ((i < mid - left+1) && (j < right - mid))
  22.     {
  23.         if (LeftBuf[i] <= RightBuf[j])
  24.         {
  25.             a[k] = LeftBuf[i];
  26.             i++;
  27.         }
  28.         else{
  29.             a[k] = RightBuf[j];
  30.             j++;
  31.         }
  32.         k++;
  33.     }
  34.     while (i < mid-left+1)
  35.     {
  36.         a[k] = LeftBuf[i];
  37.         k++;
  38.         i++;
  39.     }
  40.     while (j < right-mid)
  41.     {
  42.         a[k] = RightBuf[j];
  43.         k++;
  44.         j++;
  45.     }
  46. }
  47.  
  48. void merge_sort(int*A, int left, int right)
  49. {
  50.     int mid;
  51.     if (left < right)
  52.     {
  53.         mid = (left + right) / 2;
  54.         merge_sort(A, left, mid);
  55.         merge_sort(A, mid + 1, right);
  56.         merge(A, left, mid, right);
  57.         for (int i = 0; i < 5; i++)
  58.             cout << A[i] << " ";
  59.         printf("\n");
  60.     }
  61. }*/
  62. struct list_element;
  63. list_element *push_back(list_element *head, int key);
  64. void show_list(list_element *head);
  65. int get_key(list_element *head, int number);
  66. void set_key(list_element *head, int number, int key);
  67.  
  68. void insertSort(int *a, int n)
  69. {
  70.     int i,j, m, key;
  71.     for (j = 0; j < n; j++)
  72.     {
  73.         key = a[j];
  74.         i = j-1;
  75.         while (i >= 0 && a[i] > key)
  76.         {
  77.             a[i + 1] = a[i];
  78.             i--;
  79.         }
  80.         a[i + 1] = key;
  81.     }
  82. }
  83.  
  84. void merge(list_element *head, int left, int mid, int right)
  85. {
  86.     list_element *head_left=NULL;
  87.     list_element *head_right=NULL;
  88.     list_element *tmp=head_left;
  89.     int i, j = 0;
  90.     int k = left;
  91.     for (i = 0; i < mid - left + 1; i++)
  92.     {
  93.         head_left=push_back(head_left, get_key(head, i + left));
  94.     }
  95.     tmp = head_right;
  96.     for (i = 0; i <= right - mid - 1; i++)
  97.     {
  98.         head_right=push_back(head_right, get_key(head, i + mid + 1));
  99.     }
  100.    
  101.     i = 0;
  102.     while ((i < mid - left + 1) && (j < right - mid))
  103.     {
  104.         if (get_key(head_left, i) <= get_key(head_right, j))
  105.         {
  106.             set_key(head, k, get_key(head_left, i));
  107.             i++;
  108.         }
  109.         else{
  110.             set_key(head, k, get_key(head_right, j));
  111.             j++;
  112.         }
  113.         k++;
  114.     }
  115.     while (i < mid - left + 1)
  116.     {
  117.         set_key(head, k, get_key(head_left, i));
  118.         k++;
  119.         i++;
  120.     }
  121.     while (j < right - mid)
  122.     {
  123.         set_key(head, k, get_key(head_right, j));
  124.         k++;
  125.         j++;
  126.     }
  127. }
  128.  
  129. void merge_sort(list_element *head, int left, int right)
  130. {
  131.     int mid;
  132.     if (left < right)
  133.     {
  134.         mid = (left + right) / 2;
  135.         merge_sort(head, left, mid);
  136.         merge_sort(head, mid + 1, right);
  137.         merge(head, left, mid, right);
  138.     }
  139. }
  140.  
  141. struct list_element
  142. {
  143.     int key=0;
  144.     list_element *next=0;
  145.     list_element(){};
  146. };
  147.  
  148. list_element *push_back(list_element *head, int key)
  149. {
  150.    
  151.     list_element *new_elem = new list_element;
  152.     new_elem->key = key;
  153.     if (head == NULL)
  154.     {
  155.         head = new_elem;
  156.         return head;
  157.     }
  158.     list_element *tmp = head;
  159.     while (tmp->next != 0)
  160.     {
  161.         tmp = tmp->next;
  162.     }
  163.     tmp->next = new_elem;
  164.     return head;
  165. }
  166.  
  167. int get_key(list_element *head, int number)
  168. {
  169.     list_element *tmp=head;
  170.     while (number > 0)
  171.     {
  172.         tmp = tmp->next;
  173.         number--;
  174.     }
  175.     return tmp->key;
  176. }
  177. void set_key(list_element *head, int number,int key)
  178. {
  179.     list_element *tmp = head;
  180.     while (number > 0)
  181.     {
  182.         tmp = tmp->next;
  183.         number--;
  184.     }
  185.     tmp->key = key;
  186. }
  187.  
  188. void show_list(list_element *head)
  189. {
  190.     list_element *tmp = head;
  191.     while (tmp != 0)
  192.     {
  193.         cout << tmp->key << " ";
  194.         tmp = tmp->next;
  195.     }
  196.     cout <<endl;
  197. }
  198.  
  199. int main()
  200. {
  201.     int i;
  202.     int a[8] = { 6, 1, 4, 0, 9, 0, 9, 4};
  203.     int length = sizeof(a) / sizeof(*a);
  204.     list_element *head = NULL;
  205.     for (i = 0; i < length; i++)
  206.     {
  207.         head = push_back(head, a[i]);
  208.     }
  209.     show_list(head);
  210.     merge_sort(head, 0, length-1);
  211.     cout << "Merge sort: ";
  212.     show_list(head);
  213.     cout << "Insert sort: ";
  214.     insertSort(a, length);
  215.     for (i = 0; i < length; i++) cout << a[i] << " ";
  216.     return 0;
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement