Вот моя функция:
fun quickSort(data: List<PhEntry>, maxTime: Long = 0L): List<PhEntry> {
if (System.currentTimeMillis() > maxTime) throw Exception("")
if (data.size < 2) return data
val pivot = data[data.lastIndex / 2]
val equal = data.filter { it.name == pivot.name }
val greater = data.filter { it.name > pivot.name }
val lesser = data.filter { it.name < pivot.name }
return quickSort(lesser, maxTime) + equal + quickSort(greater, maxTime)
}
Я вызываю это из функции учета времени:
fun sortTimer(data: List<PhEntry>, time: Long = 0L, sortFunc: (sortedData: List<PhEntry>, time: Long) -> List<PhEntry>): Pair<List<PhEntry>?, Long> {
val startTime = System.currentTimeMillis()
return try{
val result = sortFunc(data, startTime + time)
Pair(result, System.currentTimeMillis() - startTime)
} catch (e: Exception) {
Pair(null, System.currentTimeMillis() - startTime)
}
}
Данные - это огромный телефонный справочник, содержащий миллион записей. Предполагается, что программа попытается отсортировать весь список в течение 90 секунд. Если это невозможно, то для простого поиска по несортированному списку следует go.
Значения времени 90000L (90 секунд) или более приводят к зависанию программы. Он не бросает никаких исключений, просто зависает. Я просто попытался использовать 1000L в качестве значения для time
, и программа работает нормально.
Почему это происходит? Я хочу в основном прекратить рекурсию, если будет достигнут срок. Я не могу использовать библиотеки kotlinx
, так как я делаю курс из HyperSkill, и они не позволяют мне изменять файл Gradle.
Редактировать 1:
При вставке println(System.currentTimeMillis())
в функции quickSort
, функция останавливается, когда System.currentTimeMillis()
превышает maxTime
. И тогда ничего не происходит. На этом этапе рекурсия очень глубокая, в этом причина такого поведения?