Advertisement
nachtvaohal

Untitled

Jan 11th, 2024
12
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.96 KB | None | 0 0
  1. package sprint3.k
  2.  
  3. /**
  4. * Принимает один массив и три целочисленных индекса: left, mid, и right.
  5. * Сливает две отсортированные части одного и того же массива в один отсортированный массив.
  6. * Первая часть массива определяется полуинтервалом [left, mid) массива array,
  7. * а вторая часть – полуинтервалом [mid, right) того же массива array.
  8. * @param arr - массив, состоящий из двух отсортированных частей.
  9. * @param left - начальный индекс левой отсортированной части массива.
  10. * @param mid - начальный индекс правой отсортированной части массива.
  11. * @param right - конечный индекс правой отсортированной части массива.
  12. * @return сливаемый массив.
  13. */
  14. fun merge(arr: IntArray, left: Int, mid: Int, right: Int): IntArray {
  15. var l = left
  16. var r = mid
  17. var resultIndex = 0
  18. val result = arr.clone()
  19. while (l < mid && r < right) {
  20. if (arr[l] <= arr[r]) {
  21. result[resultIndex] = arr[l]
  22. l++
  23. } else {
  24. result[resultIndex] = arr[r]
  25. r++
  26. }
  27. resultIndex++
  28. }
  29.  
  30. while (l < mid) {
  31. result[resultIndex] = arr[l]
  32. resultIndex++
  33. l++
  34. }
  35. while (r < right) {
  36. result[resultIndex] = arr[r]
  37. resultIndex++
  38. r++
  39. }
  40. return result
  41. }
  42.  
  43. /**
  44. * Принимает некоторый подмассив, который нужно отсортировать. Подмассив задаётся полуинтервалом — его началом и концом.
  45. * Разбивает полуинтервал на две половинки и рекурсивно вызывает сортировку отдельно для каждой.
  46. * Затем два отсортированных массива сливаются в один с помощью [merge].
  47. * @param arr массив, который надо отсортировать
  48. * @param left индекс начала полуинтервала
  49. * @param right индекс конца полуинтервал
  50. */
  51. fun merge_sort(arr: IntArray, left: Int, right: Int) {
  52. if (right - left <= 1) {
  53. return
  54. }
  55. val mid = (right - left) / 2
  56. if (left == mid) {
  57. return
  58. }
  59.  
  60.  
  61. }
  62.  
  63. fun test() {
  64. val a = intArrayOf(1, 4, 9, 2, 10, 11)
  65. val b: IntArray = merge(a, 0, 3, 6)
  66. val expected = intArrayOf(1, 2, 4, 9, 10, 11)
  67. assert(b.contentEquals(expected))
  68. val c = intArrayOf(1, 4, 2, 10, 1, 2)
  69. merge_sort(c, 0, 6)
  70. val expected2 = intArrayOf(1, 1, 2, 2, 4, 10)
  71. assert(c.contentEquals(expected2))
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement