sort.odin 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. bubble_sort :: proc(array: $A/[]$T, f: proc(T, T) -> int) {
  2. assert(f != nil);
  3. count := len(array);
  4. init_j, last_j := 0, count-1;
  5. for {
  6. init_swap, prev_swap := -1, -1;
  7. for j in init_j..last_j {
  8. if f(array[j], array[j+1]) > 0 {
  9. array[j], array[j+1] = array[j+1], array[j];
  10. prev_swap = j;
  11. if init_swap == -1 do init_swap = j;
  12. }
  13. }
  14. if prev_swap == -1 do return;
  15. init_j = max(init_swap-1, 0);
  16. last_j = prev_swap;
  17. }
  18. }
  19. bubble_sort :: proc(array: $A/[]$T) {
  20. count := len(array);
  21. init_j, last_j := 0, count-1;
  22. for {
  23. init_swap, prev_swap := -1, -1;
  24. for j in init_j..last_j {
  25. if array[j] > array[j+1] {
  26. array[j], array[j+1] = array[j+1], array[j];
  27. prev_swap = j;
  28. if init_swap == -1 do init_swap = j;
  29. }
  30. }
  31. if prev_swap == -1 do return;
  32. init_j = max(init_swap-1, 0);
  33. last_j = prev_swap;
  34. }
  35. }
  36. quick_sort :: proc(array: $A/[]$T, f: proc(T, T) -> int) {
  37. assert(f != nil);
  38. a := array;
  39. n := len(a);
  40. if n < 2 do return;
  41. p := a[n/2];
  42. i, j := 0, n-1;
  43. loop: for {
  44. for f(a[i], p) < 0 do i += 1;
  45. for f(p, a[j]) < 0 do j -= 1;
  46. if i >= j do break loop;
  47. a[i], a[j] = a[j], a[i];
  48. i += 1;
  49. j -= 1;
  50. }
  51. quick_sort(a[0..i], f);
  52. quick_sort(a[i..n], f);
  53. }
  54. quick_sort :: proc(array: $A/[]$T) {
  55. a := array;
  56. n := len(a);
  57. if n < 2 do return;
  58. p := a[n/2];
  59. i, j := 0, n-1;
  60. loop: for {
  61. for a[i] < p do i += 1;
  62. for p < a[j] do j -= 1;
  63. if i >= j do break loop;
  64. a[i], a[j] = a[j], a[i];
  65. i += 1;
  66. j -= 1;
  67. }
  68. quick_sort(a[0..i]);
  69. quick_sort(a[i..n]);
  70. }
  71. _log2 :: proc(n: int) -> int {
  72. res := 0;
  73. for ; n != 0; n >>= 1 do res += 1;
  74. return res;
  75. }
  76. merge_sort :: proc(array: $A/[]$T, f: proc(T, T) -> int) {
  77. merge_slices :: proc(arr1, arr2, out: A, f: proc(T, T) -> int) {
  78. N1, N2 := len(arr1), len(arr2);
  79. i, j := 0, 0;
  80. for k in 0..N1+N2 {
  81. if j == N2 || i < N1 && j < N2 && f(arr1[i], arr2[j]) < 0 {
  82. out[k] = arr1[i];
  83. i += 1;
  84. } else {
  85. out[k] = arr2[j];
  86. j += 1;
  87. }
  88. }
  89. }
  90. assert(f != nil);
  91. arr1 := array;
  92. N := len(arr1);
  93. arr2 := make([]T, N);
  94. defer free(arr2);
  95. a, b, m, M := N/2, N, 1, _log2(N);
  96. for i in 0..M+1 {
  97. for j in 0..a {
  98. k := 2*j*m;
  99. merge_slices(arr1[k..k+m], arr1[k+m..k+m+m], arr2[k..], f);
  100. }
  101. if N-b > m {
  102. k := 2*a*m;
  103. merge_slices(arr1[k..k+m], arr1[k+m..k+m+(N-b)&(m-1)], arr2[k..], f);
  104. } else {
  105. copy(arr2[b..N], arr1[b..N]);
  106. }
  107. arr1, arr2 = arr2, arr1;
  108. m <<= 1;
  109. a >>= 1;
  110. b = a << uint(i) << 2;
  111. }
  112. if M & 1 == 0 do copy(arr2, arr1);
  113. }
  114. merge_sort :: proc(array: $A/[]$T) {
  115. merge_slices :: proc(arr1, arr2, out: A) {
  116. N1, N2 := len(arr1), len(arr2);
  117. i, j := 0, 0;
  118. for k in 0..N1+N2 {
  119. if j == N2 || i < N1 && j < N2 && arr1[i] < arr2[j] {
  120. out[k] = arr1[i];
  121. i += 1;
  122. } else {
  123. out[k] = arr2[j];
  124. j += 1;
  125. }
  126. }
  127. }
  128. arr1 := array;
  129. N := len(arr1);
  130. arr2 := make([]T, N);
  131. defer free(arr2);
  132. a, b, m, M := N/2, N, 1, _log2(N);
  133. for i in 0..M+1 {
  134. for j in 0..a {
  135. k := 2*j*m;
  136. merge_slices(arr1[k..k+m], arr1[k+m..k+m+m], arr2[k..]);
  137. }
  138. if N-b > m {
  139. k := 2*a*m;
  140. merge_slices(arr1[k..k+m], arr1[k+m..k+m+(N-b)&(m-1)], arr2[k..]);
  141. } else {
  142. copy(arr2[b..N], arr1[b..N]);
  143. }
  144. arr1, arr2 = arr2, arr1;
  145. m <<= 1;
  146. a >>= 1;
  147. b = a << uint(i) << 2;
  148. }
  149. if M & 1 == 0 do copy(arr2, arr1);
  150. }
  151. compare_ints :: proc(a, b: int) -> int {
  152. match delta := a - b; {
  153. case delta < 0: return -1;
  154. case delta > 0: return +1;
  155. }
  156. return 0;
  157. }
  158. compare_f32s :: proc(a, b: f32) -> int {
  159. match delta := a - b; {
  160. case delta < 0: return -1;
  161. case delta > 0: return +1;
  162. }
  163. return 0;
  164. }
  165. compare_f64s :: proc(a, b: f64) -> int {
  166. match delta := a - b; {
  167. case delta < 0: return -1;
  168. case delta > 0: return +1;
  169. }
  170. return 0;
  171. }
  172. compare_strings :: proc(a, b: string) -> int {
  173. return __string_cmp(a, b);
  174. }