Ladies_Man

#SORT__3_1 Iterative Qsort (Stack)

Dec 17th, 2013
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.74 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. struct task{
  5.     int low, high;
  6. };
  7.  
  8. struct stack {
  9.     struct task *array;
  10.     int top;
  11.     int cap;
  12. };
  13.  
  14. void push (struct stack *st, int l, int r)
  15. {
  16.     st->array[st->top].low = l;
  17.     st->array[st->top].high = r - 1;
  18.     st->top++;
  19. }
  20.  
  21. void pop (struct stack *stk, struct task *tsk)
  22. {
  23.     stk->top--;
  24.     tsk->low = stk->array[stk->top].low;
  25.     tsk->high = stk->array[stk->top].high;
  26. }
  27.  
  28. void swap (int *arr, int i, int j)
  29. {
  30.     int temp = arr[i];
  31.     arr[i] = arr[j];
  32.     arr[j] = temp;
  33. }
  34.  
  35. void iter_qs (int *array, int n)
  36. {
  37.    
  38.     struct stack stk;
  39.     struct task tsk;
  40.     int i = 0, j = n - 1, mid, supp, size = n;
  41.     stk.array = malloc(size * sizeof(struct task));
  42.     stk.top = 0;
  43.     stk.cap = n;
  44.     stk.array[stk.top].low = i;
  45.     stk.array[stk.top].high = j;
  46.     stk.top++;
  47.  
  48.     while (stk.top != 0) {
  49.         pop (&stk, &tsk);
  50.         while (tsk.high > tsk.low) {
  51.             i = tsk.low;
  52.             j = tsk.high;
  53.             supp = array[(i + j) / 2];
  54.             //stdqs (array, i, j, supp);
  55.             while (i <= j) {
  56.                 while (array[i] < supp) i++;
  57.                 while (array[j] > supp) j--;
  58.                 if (i <= j) {
  59.                     swap (array, i, j);
  60.                     i++;
  61.                     j--;
  62.                 }
  63.             }
  64.             if (i < ((tsk.low + tsk.high) / 2) && i < tsk.high && tsk.low >= j) {
  65.                 push (&stk, i, tsk.high + 1);
  66.                 tsk.high = j;
  67.                 continue;
  68.             }
  69.             push (&stk, tsk.low, j + 1);
  70.             tsk.low = i;
  71.         }
  72.     }
  73.     free (stk.array);
  74. }
  75.  
  76. int main ()
  77. {
  78.     int *array;
  79.     int i, n;
  80.  
  81.     scanf ("%d", &n);
  82.  
  83.     array = (int*)malloc(n * sizeof(int));
  84.     for (i = 0; i < n; i++) scanf("%d", array + i);
  85.  
  86.     iter_qs (array, n);
  87.  
  88.     for (i = 0; i < n; i++) printf("%d ", array[i]);
  89.  
  90.     free(array);
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment