SQUASHME: Make merge sort stable
This commit is contained in:
@@ -21,7 +21,7 @@ import kotlin.comparisons.*
|
|||||||
// TODO: Implement sort for primitives with a custom comparator.
|
// TODO: Implement sort for primitives with a custom comparator.
|
||||||
|
|
||||||
// Array<T> =============================================================================
|
// Array<T> =============================================================================
|
||||||
// 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).
|
// the comparator or the comparable implementation is incorrect (e.g. if it never returns 0).
|
||||||
|
|
||||||
// Sort of comparables.
|
// Sort of comparables.
|
||||||
@@ -46,7 +46,7 @@ private fun <T: Comparable<T>> mergeSort(array: Array<T>, buffer: Array<T>, star
|
|||||||
|
|
||||||
val target = if (left === buffer) array else buffer
|
val target = if (left === buffer) array else buffer
|
||||||
|
|
||||||
// Merge
|
// Merge.
|
||||||
var leftIndex = start
|
var leftIndex = start
|
||||||
var rightIndex = median + 1
|
var rightIndex = median + 1
|
||||||
for (i in start..end) {
|
for (i in start..end) {
|
||||||
@@ -55,7 +55,7 @@ private fun <T: Comparable<T>> mergeSort(array: Array<T>, buffer: Array<T>, star
|
|||||||
val leftValue = left[leftIndex]
|
val leftValue = left[leftIndex]
|
||||||
val rightValue = right[rightIndex]
|
val rightValue = right[rightIndex]
|
||||||
|
|
||||||
if (leftValue < rightValue) {
|
if (leftValue <= rightValue) {
|
||||||
target[i] = leftValue
|
target[i] = leftValue
|
||||||
leftIndex++
|
leftIndex++
|
||||||
} else {
|
} else {
|
||||||
@@ -77,7 +77,7 @@ private fun <T: Comparable<T>> mergeSort(array: Array<T>, buffer: Array<T>, star
|
|||||||
return target
|
return target
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort with comparator
|
// Sort with comparator.
|
||||||
private fun <T> mergeSort(array: Array<T>, start: Int, endInclusive: Int, comparator: Comparator<T>) {
|
private fun <T> mergeSort(array: Array<T>, start: Int, endInclusive: Int, comparator: Comparator<T>) {
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
val buffer = arrayOfNulls<Any?>(array.size) as Array<T>
|
val buffer = arrayOfNulls<Any?>(array.size) as Array<T>
|
||||||
@@ -99,7 +99,7 @@ private fun <T> mergeSort(array: Array<T>, buffer: Array<T>, start: Int, end: In
|
|||||||
|
|
||||||
val target = if (left === buffer) array else buffer
|
val target = if (left === buffer) array else buffer
|
||||||
|
|
||||||
// Merge
|
// Merge.
|
||||||
var leftIndex = start
|
var leftIndex = start
|
||||||
var rightIndex = median + 1
|
var rightIndex = median + 1
|
||||||
for (i in start..end) {
|
for (i in start..end) {
|
||||||
@@ -108,7 +108,7 @@ private fun <T> mergeSort(array: Array<T>, buffer: Array<T>, start: Int, end: In
|
|||||||
val leftValue = left[leftIndex]
|
val leftValue = left[leftIndex]
|
||||||
val rightValue = right[rightIndex]
|
val rightValue = right[rightIndex]
|
||||||
|
|
||||||
if (comparator.compare(leftValue, rightValue) < 0) {
|
if (comparator.compare(leftValue, rightValue) <= 0) {
|
||||||
target[i] = leftValue
|
target[i] = leftValue
|
||||||
leftIndex++
|
leftIndex++
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user