From e14570a6b6f6c1ca4f1f5f285ef734a970163140 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Wed, 22 Aug 2018 19:38:42 +0700 Subject: [PATCH] SQUASHME: Make merge sort stable --- runtime/src/main/kotlin/kotlin/util/Sort.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/runtime/src/main/kotlin/kotlin/util/Sort.kt b/runtime/src/main/kotlin/kotlin/util/Sort.kt index 7e9e361745d..0a959d7ef85 100644 --- a/runtime/src/main/kotlin/kotlin/util/Sort.kt +++ b/runtime/src/main/kotlin/kotlin/util/Sort.kt @@ -21,7 +21,7 @@ import kotlin.comparisons.* // TODO: Implement sort for primitives with a custom comparator. // Array ============================================================================= -// We use merge becuase the quick sort may cause segfaults if +// We use merge because the quick sort may cause segfaults if // the comparator or the comparable implementation is incorrect (e.g. if it never returns 0). // Sort of comparables. @@ -46,7 +46,7 @@ private fun > mergeSort(array: Array, buffer: Array, star val target = if (left === buffer) array else buffer - // Merge + // Merge. var leftIndex = start var rightIndex = median + 1 for (i in start..end) { @@ -55,7 +55,7 @@ private fun > mergeSort(array: Array, buffer: Array, star val leftValue = left[leftIndex] val rightValue = right[rightIndex] - if (leftValue < rightValue) { + if (leftValue <= rightValue) { target[i] = leftValue leftIndex++ } else { @@ -77,7 +77,7 @@ private fun > mergeSort(array: Array, buffer: Array, star return target } -// Sort with comparator +// Sort with comparator. private fun mergeSort(array: Array, start: Int, endInclusive: Int, comparator: Comparator) { @Suppress("UNCHECKED_CAST") val buffer = arrayOfNulls(array.size) as Array @@ -99,7 +99,7 @@ private fun mergeSort(array: Array, buffer: Array, start: Int, end: In val target = if (left === buffer) array else buffer - // Merge + // Merge. var leftIndex = start var rightIndex = median + 1 for (i in start..end) { @@ -108,7 +108,7 @@ private fun mergeSort(array: Array, buffer: Array, start: Int, end: In val leftValue = left[leftIndex] val rightValue = right[rightIndex] - if (comparator.compare(leftValue, rightValue) < 0) { + if (comparator.compare(leftValue, rightValue) <= 0) { target[i] = leftValue leftIndex++ } else {