sort.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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, int n, int k);
  13. static void downheap_float(float *array, int n, int k);
  14. static void downheap_double(double *array, int n, int k);
  15. /* *************************************************************** */
  16. /* *************************************************************** */
  17. /* *************************************************************** */
  18. void downheap_int(int *array, int n, int k)
  19. {
  20. int j, v;
  21. v = array[k];
  22. while (k <= n / 2) {
  23. j = k + k;
  24. if (j < n && array[j] < array[j + 1])
  25. j++;
  26. if (v >= array[j])
  27. break;
  28. array[k] = array[j];
  29. k = j;
  30. }
  31. array[k] = v;
  32. }
  33. /* *************************************************************** */
  34. /* *************************************************************** */
  35. /* *************************************************************** */
  36. void downheap_float(float *array, int n, int k)
  37. {
  38. int j;
  39. float v;
  40. v = array[k];
  41. while (k <= n / 2) {
  42. j = k + k;
  43. if (j < n && array[j] < array[j + 1])
  44. j++;
  45. if (v >= array[j])
  46. break;
  47. array[k] = array[j];
  48. k = j;
  49. }
  50. array[k] = v;
  51. }
  52. /* *************************************************************** */
  53. /* *************************************************************** */
  54. /* *************************************************************** */
  55. void downheap_double(double *array, int n, int k)
  56. {
  57. int j;
  58. double v;
  59. v = array[k];
  60. while (k <= n / 2) {
  61. j = k + k;
  62. if (j < n && array[j] < array[j + 1])
  63. j++;
  64. if (v >= array[j])
  65. break;
  66. array[k] = array[j];
  67. k = j;
  68. }
  69. array[k] = v;
  70. }
  71. /* *************************************************************** */
  72. /* ****** heapsort for int arrays of size n ********************** */
  73. /* *************************************************************** */
  74. void heapsort_int(int *array, int n)
  75. {
  76. int k, t;
  77. --n;
  78. for (k = n / 2; k >= 0; k--)
  79. downheap_int(array, n, k);
  80. while (n > 0) {
  81. t = array[0];
  82. array[0] = array[n];
  83. array[n] = t;
  84. downheap_int(array, --n, 0);
  85. }
  86. return;
  87. }
  88. /* *************************************************************** */
  89. /* ****** heapsort for float arrays of size n ******************** */
  90. /* *************************************************************** */
  91. void heapsort_float(float *array, int n)
  92. {
  93. int k;
  94. float t;
  95. --n;
  96. for (k = n / 2; k >= 0; k--)
  97. downheap_float(array, n, k);
  98. while (n > 0) {
  99. t = array[0];
  100. array[0] = array[n];
  101. array[n] = t;
  102. downheap_float(array, --n, 0);
  103. }
  104. return;
  105. }
  106. /* *************************************************************** */
  107. /* ****** heapsort for double arrays of size n ******************* */
  108. /* *************************************************************** */
  109. void heapsort_double(double *array, int n)
  110. {
  111. int k;
  112. double t;
  113. --n;
  114. for (k = n / 2; k >= 0; k--)
  115. downheap_double(array, n, k);
  116. while (n > 0) {
  117. t = array[0];
  118. array[0] = array[n];
  119. array[n] = t;
  120. downheap_double(array, --n, 0);
  121. }
  122. return;
  123. }