Sort.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /* Sort.c */
  2. #include "Sort.h"
  3. #define HeapSortDown(p, k, size, temp) \
  4. { for (;;) { \
  5. UInt32 s = (k << 1); \
  6. if (s > size) break; \
  7. if (s < size && p[s + 1] > p[s]) s++; \
  8. if (temp >= p[s]) break; \
  9. p[k] = p[s]; k = s; \
  10. } p[k] = temp; }
  11. void HeapSort(UInt32 *p, UInt32 size)
  12. {
  13. if (size <= 1)
  14. return;
  15. p--;
  16. {
  17. UInt32 i = size / 2;
  18. do
  19. {
  20. UInt32 temp = p[i];
  21. UInt32 k = i;
  22. HeapSortDown(p, k, size, temp)
  23. }
  24. while(--i != 0);
  25. }
  26. /*
  27. do
  28. {
  29. UInt32 k = 1;
  30. UInt32 temp = p[size];
  31. p[size--] = p[1];
  32. HeapSortDown(p, k, size, temp)
  33. }
  34. while (size > 1);
  35. */
  36. while (size > 3)
  37. {
  38. UInt32 temp = p[size];
  39. UInt32 k = (p[3] > p[2]) ? 3 : 2;
  40. p[size--] = p[1];
  41. p[1] = p[k];
  42. HeapSortDown(p, k, size, temp)
  43. }
  44. {
  45. UInt32 temp = p[size];
  46. p[size] = p[1];
  47. if (size > 2 && p[2] < temp)
  48. {
  49. p[1] = p[2];
  50. p[2] = temp;
  51. }
  52. else
  53. p[1] = temp;
  54. }
  55. }
  56. /*
  57. #define HeapSortRefDown(p, vals, n, size, temp) \
  58. { UInt32 k = n; UInt32 val = vals[temp]; for (;;) { \
  59. UInt32 s = (k << 1); \
  60. if (s > size) break; \
  61. if (s < size && vals[p[s + 1]] > vals[p[s]]) s++; \
  62. if (val >= vals[p[s]]) break; \
  63. p[k] = p[s]; k = s; \
  64. } p[k] = temp; }
  65. void HeapSortRef(UInt32 *p, UInt32 *vals, UInt32 size)
  66. {
  67. if (size <= 1)
  68. return;
  69. p--;
  70. {
  71. UInt32 i = size / 2;
  72. do
  73. {
  74. UInt32 temp = p[i];
  75. HeapSortRefDown(p, vals, i, size, temp);
  76. }
  77. while(--i != 0);
  78. }
  79. do
  80. {
  81. UInt32 temp = p[size];
  82. p[size--] = p[1];
  83. HeapSortRefDown(p, vals, 1, size, temp);
  84. }
  85. while (size > 1);
  86. }
  87. */