Advertisement
Guest User

Sorting algorithms

a guest
Jan 17th, 2019
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.62 KB | None | 0 0
  1. #include <string.h>
  2. #include <stdlib.h>
  3.  
  4. int *merge(int aarr[], int alen, int barr[], int blen)
  5. {
  6.     int *tmp = malloc((alen + blen)*sizeof(int));
  7.     int *ptr = tmp; /*points at next empty spot in tmp*/
  8.     int *aptr = aarr, *bptr = barr;
  9.     do
  10.     {
  11.         if(*aptr > *bptr)
  12.         {
  13.             *(ptr++) = *bptr;
  14.             bptr++; blen--;
  15.         }
  16.         else
  17.         {
  18.             *(ptr++) = *aptr;
  19.             aptr++; alen--;
  20.         }
  21.     }
  22.     while(alen != 0 && blen != 0);
  23.  
  24.     if(alen != 0)
  25.         memcpy(ptr, aptr, alen * sizeof(int));
  26.     else
  27.         memcpy(ptr, bptr, blen * sizeof(int));
  28.     return tmp;
  29. }
  30.  
  31. void merge_sort(int arr[], int len)
  32. {
  33.     int *res;
  34.     if(len == 1)
  35.         return;
  36.    
  37.     merge_sort(arr, len/2);
  38.     merge_sort(arr + (len/2), len - len/2);
  39.  
  40.     res = merge(arr, len/2, arr+len/2, len - len/2);
  41.     memcpy(arr, res, len * sizeof(int));
  42.     free(res);
  43. }
  44.  
  45. void swap(int *a, int *b)
  46. {
  47.     int tmp = *a;
  48.     *a = *b;
  49.     *b = tmp;
  50. }
  51.  
  52. void insertion_sort(int arr[], int len)
  53. {
  54.     int i, j;
  55.     for(i = 1; i < len; i++)
  56.         for(j = i; j > 0 && arr[j-1] > arr[j]; j--)
  57.             swap(arr + j - 1, arr + j);
  58. }
  59.  
  60. void bubble_sort(int arr[], int len)
  61. {
  62.     int j, sorted;
  63.     do
  64.         for(sorted = 1, j = 1; j < len; j++)
  65.             if(arr[j-1] > arr[j])
  66.             {
  67.                 swap(arr + j - 1, arr + j);
  68.                 sorted = 0;
  69.             }
  70.     while (!sorted);
  71. }
  72.  
  73. void better_bubble_sort(int arr[], int len)
  74. {
  75.     int i, j, sorted = 0;
  76.     for(i = len - 1; i > 0 && !sorted; i--)
  77.         for(j = 1, sorted = 1; j <= i; j++)
  78.             if(arr[j-1] > arr[j])
  79.             {
  80.                 sorted = 0;
  81.                 swap(arr + j - 1, arr + j);
  82.             }
  83. }
  84.  
  85. int partition(int arr[], int len)
  86. {
  87.     int pivot, i, j;
  88.     pivot = arr[len-1];
  89.     for(i=-1, j = 0; j < len - 1; j++)
  90.         if(arr[j] <= pivot)
  91.             swap(arr + ++i, arr + j);
  92.     swap(arr + i + 1, arr + len - 1);
  93.     return i + 1;
  94. }
  95.  
  96. void quick_sort(int arr[], int len)
  97. {
  98.     int q;
  99.     /*p = 0, r = len - 1*/
  100.     if(len <= 1)
  101.         return;
  102.     q = partition(arr, len);
  103.     quick_sort(arr, q);
  104.     quick_sort(arr + q + 1, len - q - 1);
  105. }
  106.  
  107. void cocktail_sort(int arr[], int len)
  108. {
  109.     int swapped, i;
  110.     do
  111.     {
  112.         swapped = 0;
  113.         for(i = 0; i < len - 1; i++)
  114.             if(arr[i] > arr[i + 1])
  115.             {
  116.                 swap(arr + i, arr + i + 1);
  117.                 swapped = 1;
  118.             }
  119.         if(!swapped)
  120.             break;
  121.         swapped = 0;
  122.         for(i = len - 2; i >= 0; i--)
  123.             if(arr[i] > arr[i+1])
  124.             {
  125.                 swap(arr + i, arr + i + 1);
  126.                 swapped = 1;
  127.             }
  128.     }
  129.     while(swapped);
  130. }
  131.  
  132. void cocktail_sort_gapped(int arr[], int offset, int len, int gap)
  133. {
  134.     int swapped, i;
  135.     do
  136.     {
  137.         swapped = 0;
  138.         for(i = offset; i + gap < len; i+=gap)
  139.             if(arr[i] > arr[i + gap])
  140.             {
  141.                 swap(arr + i, arr + i + gap);
  142.                 swapped = 1;
  143.             }
  144.         if(!swapped)
  145.             break;
  146.         swapped = 0;
  147.         for(i = len - 1 - gap - offset; i >= 0; i-=gap)
  148.             if(arr[i] > arr[i + gap])
  149.             {
  150.                 swap(arr + i, arr + i + gap);
  151.                 swapped = 1;
  152.             }
  153.     }
  154.     while(swapped);
  155. }
  156.  
  157. void shell_sort(int arr[], int len)
  158. {
  159.     int gap, i;
  160.     for(gap = 2; gap < len; gap *= 2)
  161.         for(i = 0;i < len / gap + (len % gap != 0 ? 1 : 0); i++)
  162.             cocktail_sort_gapped(arr, i, len, gap);
  163.     cocktail_sort(arr, len);
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement