Advertisement
Guest User

qsort.c

a guest
Dec 21st, 2014
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.69 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void swap(int *a, int *b)
  5. {
  6.     int buffer;
  7.     buffer = *a;
  8.     *a = *b;
  9.     *b = buffer;
  10. }
  11.  
  12. struct Task
  13. {
  14.     int low;
  15.     int high;
  16. };
  17. struct stack
  18. {
  19.     struct Task *data;
  20.     int cap;
  21.     int top;
  22. };
  23. void InitStack(struct stack *s, int n)
  24. {
  25.     s->data = calloc(n, sizeof(struct Task));
  26.     s->cap = n;
  27.     s->top = 0;
  28. }
  29. void Push(struct stack *s, struct Task x)
  30. {
  31.     s->data[s->top] = x;
  32.     s->top++;
  33. }
  34. struct Task Pop(struct stack *s)
  35. {
  36.     return s->data[--s->top];
  37. }
  38. int StackEmpty(struct stack *s)
  39. {
  40.     return (s->top == 0) ? 1 : 0;
  41. }
  42.  
  43. void Quicksort(int *arr, int n)
  44. {
  45.     int i, k, left, right, mid, q, buffer;
  46.  
  47.     struct stack tasks;
  48.     InitStack(&tasks, 0);
  49.     struct Task start;
  50.     start.low = 0;
  51.     start.high = n - 1;
  52.     Push(&tasks, start);
  53.  
  54.     while (!StackEmpty(&tasks))
  55.     {
  56.         struct Task temp = Pop(&tasks);
  57.         left = temp.low;
  58.         right = temp.high;
  59.  
  60.         while (left < right)
  61.         {
  62.             mid = (left + right) >> 1;
  63.             i = left;
  64.             k = right;
  65.             q = arr[mid];
  66.  
  67.             for (; i <= k; i++, k--)
  68.             {
  69.                 while (arr[i] < q)
  70.                     i++;
  71.                 while (q < arr[k])
  72.                     k--;
  73.  
  74.                 if (i <= k)
  75.                     swap(&arr[i], &arr[k]);
  76.             }
  77.  
  78.             if (i < mid)
  79.             {
  80.                 if (i < right)
  81.                 {
  82.                     temp.low = i;
  83.                     temp.high = right;
  84.                     Push(&tasks, temp);
  85.                 }
  86.  
  87.                 right = k;
  88.             }
  89.             else
  90.             {
  91.                 if (k > left)
  92.                 {
  93.                     temp.low = left;
  94.                     temp.high = k;
  95.                     Push(&tasks, temp);
  96.                 }
  97.  
  98.                 left = i;
  99.             }
  100.         }
  101.     }
  102.  
  103.     free(tasks.data);
  104. }
  105.  
  106. int main()
  107. {
  108.     int i, n;
  109.     scanf("%d", &n);
  110.     int arr[n];
  111.     for (i = 0; i < n; i++)
  112.         scanf("%d", &arr[i]);
  113.  
  114.     Quicksort(arr, n);
  115.  
  116.  
  117.     for (i = 0; i < n; i++)
  118.         printf("%d ", arr[i]);
  119.     printf("\n");
  120.  
  121.     return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement