qsort.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /*
  2. * This file lifted in toto from 'Dlibs' on the atari ST (RdeBath)
  3. *
  4. *
  5. * Dale Schumacher 399 Beacon Ave.
  6. * (alias: Dalnefre') St. Paul, MN 55104
  7. * dal@syntel.UUCP United States of America
  8. * "It's not reality that's important, but how you perceive things."
  9. */
  10. #include <string.h>
  11. char *_qbuf = 0; /* pointer to storage for qsort() */
  12. #define PIVOT ((i+j)>>1)
  13. #define moveitem(dst,src,size) if(dst != src) memcpy(dst, src, size)
  14. static
  15. _wqsort(base, lo, hi, cmp)
  16. register int *base;
  17. register int lo;
  18. register int hi;
  19. register int (*cmp) ();
  20. {
  21. int k;
  22. register int i, j, t;
  23. register int *p = &k;
  24. while (hi > lo)
  25. {
  26. i = lo;
  27. j = hi;
  28. t = PIVOT;
  29. *p = base[t];
  30. base[t] = base[i];
  31. base[i] = *p;
  32. while (i < j)
  33. {
  34. while (((*cmp) ((base + j), p)) > 0)
  35. --j;
  36. base[i] = base[j];
  37. while ((i < j) && (((*cmp) ((base + i), p)) <= 0))
  38. ++i;
  39. base[j] = base[i];
  40. }
  41. base[i] = *p;
  42. if ((i - lo) < (hi - i))
  43. {
  44. _wqsort(base, lo, (i - 1), cmp);
  45. lo = i + 1;
  46. }
  47. else
  48. {
  49. _wqsort(base, (i + 1), hi, cmp);
  50. hi = i - 1;
  51. }
  52. }
  53. }
  54. static
  55. _lqsort(base, lo, hi, cmp)
  56. register long *base;
  57. register int lo;
  58. register int hi;
  59. register int (*cmp) ();
  60. {
  61. long k;
  62. register int i, j, t;
  63. register long *p = &k;
  64. while (hi > lo)
  65. {
  66. i = lo;
  67. j = hi;
  68. t = PIVOT;
  69. *p = base[t];
  70. base[t] = base[i];
  71. base[i] = *p;
  72. while (i < j)
  73. {
  74. while (((*cmp) ((base + j), p)) > 0)
  75. --j;
  76. base[i] = base[j];
  77. while ((i < j) && (((*cmp) ((base + i), p)) <= 0))
  78. ++i;
  79. base[j] = base[i];
  80. }
  81. base[i] = *p;
  82. if ((i - lo) < (hi - i))
  83. {
  84. _lqsort(base, lo, (i - 1), cmp);
  85. lo = i + 1;
  86. }
  87. else
  88. {
  89. _lqsort(base, (i + 1), hi, cmp);
  90. hi = i - 1;
  91. }
  92. }
  93. }
  94. static
  95. _nqsort(base, lo, hi, size, cmp)
  96. register char *base;
  97. register int lo;
  98. register int hi;
  99. register int size;
  100. register int (*cmp) ();
  101. {
  102. register int i, j;
  103. register char *p = _qbuf;
  104. while (hi > lo)
  105. {
  106. i = lo;
  107. j = hi;
  108. p = (base + size * PIVOT);
  109. moveitem(_qbuf, p, size);
  110. moveitem(p, (base + size * i), size);
  111. moveitem((base + size * i), _qbuf, size);
  112. p = _qbuf;
  113. while (i < j)
  114. {
  115. while (((*cmp) ((base + size * j), p)) > 0)
  116. --j;
  117. moveitem((base + size * i), (base + size * j), size);
  118. while ((i < j) && (((*cmp) ((base + size * i), p)) <= 0))
  119. ++i;
  120. moveitem((base + size * j), (base + size * i), size);
  121. }
  122. moveitem((base + size * i), p, size);
  123. if ((i - lo) < (hi - i))
  124. {
  125. _nqsort(base, lo, (i - 1), size, cmp);
  126. lo = i + 1;
  127. }
  128. else
  129. {
  130. _nqsort(base, (i + 1), hi, size, cmp);
  131. hi = i - 1;
  132. }
  133. }
  134. }
  135. qsort(base, num, size, cmp)
  136. char *base;
  137. int num;
  138. int size;
  139. int (*cmp) ();
  140. {
  141. char _qtemp[128];
  142. if (_qbuf == 0)
  143. {
  144. if (size > sizeof(_qtemp))/* records too large! */
  145. return;
  146. _qbuf = _qtemp;
  147. }
  148. if (size == 2)
  149. _wqsort(base, 0, num - 1, cmp);
  150. else if (size == 4)
  151. _lqsort(base, 0, num - 1, cmp);
  152. else
  153. _nqsort(base, 0, num - 1, size, cmp);
  154. if (_qbuf == _qtemp)
  155. _qbuf = 0;
  156. }