loulett

HW2_qsort_simple

Nov 16th, 2014
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.38 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <ctime>
  5. #define _CRT_SECURE_NO_WARNINGS
  6.  
  7. int * generate(int* n)
  8. {
  9.     int * arr = (int *)malloc((*n) * sizeof(int));
  10.     for (int i = 0; i < *n; ++i)
  11.     {
  12.         arr[i] = rand();
  13.     }
  14.     return arr;
  15. }
  16.  
  17. int compare(void *a, void *b)
  18. {
  19.     return(*(int*)a - *(int*)b);
  20. }
  21.  
  22. typedef int(*PCmp)(void *, void*);
  23.  
  24. int partition(void * a, int l, int r, int sz, PCmp cmp)
  25. {
  26.     char *carr = (char *)a;
  27.     int i = l - 1;
  28.     void *ptmp = malloc(sz);
  29.     for (int j = l; j < r - 1; ++j)
  30.     {
  31.         if (cmp(carr + j*sz, carr + (r-1)*sz) <= 0)
  32.         {
  33.             i++;
  34.             memcpy(ptmp, carr + i*sz, sz);
  35.             memcpy(carr + i*sz, carr + j*sz, sz);
  36.             memcpy(carr + j*sz, ptmp, sz);
  37.         }
  38.     }
  39.     memcpy(ptmp, carr + (i + 1)*sz, sz);
  40.     memcpy(carr + (i + 1)*sz,carr + (r-1)*sz, sz);
  41.     memcpy(carr + (r - 1)*sz, ptmp, sz);
  42.     return i + 1;
  43. }
  44.  
  45. void qsort(int *a, int l, int r)
  46. {
  47.     if (l >= r)
  48.         return;
  49.     int q = partition(a, l, r, sizeof(int), compare);
  50.     qsort(a, l, q);
  51.     qsort(a, q + 1, r);
  52. }
  53.  
  54. int main()
  55. {
  56.     srand(time(NULL));
  57.  
  58.     int n = 0, t = 0;
  59.     scanf("%d", &n);
  60.     int* arr = generate(&n);
  61.    
  62.     qsort(arr, 0, n);
  63.     /*for (int i = 0; i < n; i++)
  64.     {
  65.         printf("%d ", arr[i]);
  66.     }*/
  67.     for (int i = 1; i < n; i++)
  68.     {
  69.         if (arr[i - 1] > arr[i])
  70.         {
  71.             printf("ERROR %d %d\n", arr[i - 1], arr[i]);
  72.             t++;
  73.         }
  74.     }
  75.     if (!t)
  76.     {
  77.         printf("OK\n");
  78.     }
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment