Advertisement
nachtvaohal

pyramid-sort-subheap-approach

Feb 23rd, 2024
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.16 KB | None | 0 0
  1. fun <T : Any> Array<T>.pyramidSort(comparator: Comparator<T>) {
  2.     // Построение дочерних куч, начиная с последнего элемента, который является родителем
  3.     for (i in size / 2 - 1 downTo 0) {
  4.         subHeap(i, size, comparator)
  5.     }
  6.     // здесь массив стал бинарной кучей, где наибольший элемент находится на [0]
  7.     for (i in size - 1 downTo 0) {
  8.         swap(0, i)
  9.         // формируется дочерняя куча без последнего элемента
  10.         subHeap(0, i, comparator)
  11.     }
  12. }
  13.  
  14. fun <T : Any> Array<T>.subHeap(parentIndex: Int, n: Int, comparator: Comparator<T>) {
  15.     var largestIndex = parentIndex
  16.     val leftChildIndex = 2 * parentIndex + 1
  17.     val rightChildIndex = 2 * parentIndex + 2
  18.  
  19.     if (leftChildIndex < n && comparator.compare(this[leftChildIndex], this[largestIndex]) > 0) {
  20.         largestIndex = leftChildIndex
  21.     }
  22.     if (rightChildIndex < n && comparator.compare(this[rightChildIndex], this[largestIndex]) > 0) {
  23.         largestIndex = rightChildIndex
  24.     }
  25.  
  26.     if (largestIndex > parentIndex) {
  27.         swap(parentIndex, largestIndex)
  28.         subHeap(largestIndex, n, comparator)
  29.     }
  30. }
  31.  
  32. private fun <T: Any> Array<T>.swap(left: Int, right: Int) {
  33.     val temp = this[right]
  34.     this[right] = this[left]
  35.     this[left] = temp
  36. }
  37.  
  38. /**
  39.  * Представление стажёра.
  40.  */
  41. data class Intern (
  42.     val name: String,
  43.     val taskCount: Int,
  44.     val penalty: Int
  45. )
  46.  
  47. fun main() {
  48.     val reader = System.`in`.bufferedReader()
  49.     val writer = System.out.bufferedWriter()
  50.     val count = reader.readLine().toInt()
  51.  
  52.     val comparator = compareByDescending<Intern> { it.taskCount }
  53.         .thenBy { it.penalty }
  54.         .thenBy { it.name }
  55.  
  56.     val array = Array(count) {
  57.         val (name, taskCount, penalty) = reader.readLine().split(" ")
  58.         Intern(name, taskCount.toInt(), penalty.toInt())
  59.     }
  60.     array.pyramidSort(comparator)
  61.  
  62.     with(writer) {
  63.         array.forEach {
  64.             println(it.name)
  65.         }
  66.         flush()
  67.     }
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement