sort.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /*
  2. * Copyright (C) 2004-2007 by the GRASS Development Team
  3. * Author(s): 1998, 1999 Sebastian Cyris
  4. * 2007 modified by Soeren Gebbert
  5. *
  6. * This program is free software under the GNU General Public
  7. * License (>=v2). Read the file COPYING that comes with GRASS
  8. * for details.
  9. *
  10. */
  11. #include "globals.h"
  12. static void downheap_int(int *array, size_t n, size_t k);
  13. static void downheap_float(float *array, size_t n, size_t k);
  14. static void downheap_double(double *array, size_t n, size_t k);
  15. /* *************************************************************** */
  16. /* *************************************************************** */
  17. /* *************************************************************** */
  18. void downheap_int(int *array, size_t n, size_t k)
  19. {
  20. size_t j;
  21. int v;
  22. v = array[k];
  23. while (k <= n / 2) {
  24. j = k + k;
  25. if (j < n && array[j] < array[j + 1])
  26. j++;
  27. if (v >= array[j])
  28. break;
  29. array[k] = array[j];
  30. k = j;
  31. }
  32. array[k] = v;
  33. }
  34. /* *************************************************************** */
  35. /* *************************************************************** */
  36. /* *************************************************************** */
  37. void downheap_float(float *array, size_t n, size_t k)
  38. {
  39. size_t j;
  40. float v;
  41. v = array[k];
  42. while (k <= n / 2) {
  43. j = k + k;
  44. if (j < n && array[j] < array[j + 1])
  45. j++;
  46. if (v >= array[j])
  47. break;
  48. array[k] = array[j];
  49. k = j;
  50. }
  51. array[k] = v;
  52. }
  53. /* *************************************************************** */
  54. /* *************************************************************** */
  55. /* *************************************************************** */
  56. void downheap_double(double *array, size_t n, size_t k)
  57. {
  58. size_t j;
  59. double v;
  60. v = array[k];
  61. while (k <= n / 2) {
  62. j = k + k;
  63. if (j < n && array[j] < array[j + 1])
  64. j++;
  65. if (v >= array[j])
  66. break;
  67. array[k] = array[j];
  68. k = j;
  69. }
  70. array[k] = v;
  71. }
  72. /* *************************************************************** */
  73. /* ****** heapsort for int arrays of size n ********************** */
  74. /* *************************************************************** */
  75. void heapsort_int(int *array, size_t n)
  76. {
  77. ssize_t k;
  78. int t;
  79. --n;
  80. for (k = n / 2; k >= 0; k--)
  81. downheap_int(array, n, k);
  82. while (n > 0) {
  83. t = array[0];
  84. array[0] = array[n];
  85. array[n] = t;
  86. downheap_int(array, --n, 0);
  87. }
  88. return;
  89. }
  90. /* *************************************************************** */
  91. /* ****** heapsort for float arrays of size n ******************** */
  92. /* *************************************************************** */
  93. void heapsort_float(float *array, size_t n)
  94. {
  95. ssize_t k;
  96. float t;
  97. --n;
  98. for (k = n / 2; k >= 0; k--)
  99. downheap_float(array, n, k);
  100. while (n > 0) {
  101. t = array[0];
  102. array[0] = array[n];
  103. array[n] = t;
  104. downheap_float(array, --n, 0);
  105. }
  106. return;
  107. }
  108. /* *************************************************************** */
  109. /* ****** heapsort for double arrays of size n ******************* */
  110. /* *************************************************************** */
  111. void heapsort_double(double *array, size_t n)
  112. {
  113. ssize_t k;
  114. double t;
  115. --n;
  116. for (k = n / 2; k >= 0; k--)
  117. downheap_double(array, n, k);
  118. while (n > 0) {
  119. t = array[0];
  120. array[0] = array[n];
  121. array[n] = t;
  122. downheap_double(array, --n, 0);
  123. }
  124. return;
  125. }