Chapters

Hide chapters

Data Structures & Algorithms in Swift

Fourth Edition · iOS 15 · Swift 5.5 · Xcode 13

33. Heapsort Challenges
Written by Vincent Ngo

Challenge 1: Add heap sort to Array

Add a heapSort() method to Array. This method should sort the array in ascending order. A starting template is in the starter playground.

Challenge 2: Theory

When performing heapsort in ascending order, which of these starting arrays requires the fewest comparisons?

  • [1,2,3,4,5]
  • [5,4,3,2,1]

Challenge 3: Descending order

The current implementation of heapsort in Chapter 32 sorts the elements in ascending order. How would you sort in descending order?

Solutions

Solution to Challenge 1

To add heap sort to Array, you must create an extension, where the elements in the array must be Comparable. Everything else is straightforward as the implementation is similar to the Heap in Chapter 32.

You are now referencing the internal properties of the Array.

extension Array where Element: Comparable {

  func leftChildIndex(ofParentAt index: Int) -> Int {
    (2 * index) + 1
  }

  func rightChildIndex(ofParentAt index: Int) -> Int {
    (2 * index) + 2
  }

  mutating func siftDown(from index: Int, upTo size: Int) {
    var parent = index
    while true {
      let left = leftChildIndex(ofParentAt: parent)
      let right = rightChildIndex(ofParentAt: parent)
      var candidate = parent

      if (left < size) && (self[left] > self[candidate]) {
        candidate = left
      }
      if (right < size) && (self[right] > self[candidate]) {
        candidate = right
      }
      if candidate == parent {
        return
      }
      swapAt(parent, candidate)
      parent = candidate
    }
  }

  mutating func heapSort() {
    // Build Heap
    if !isEmpty {
      for i in stride(from: count / 2 - 1, through: 0, by: -1) {
        siftDown(from: i, upTo: count)
      }
    }

    // Perform Heap Sort.
    for index in indices.reversed() {
      swapAt(0, index)
      siftDown(from: 0, upTo: index)
    }
  }
}

Solution to Challenge 2

When sorting elements in ascending order using heap sort, you first need a max heap. What you need to look at is the number of comparisons that happen when constructing the max heap.

[5,4,3,2,1] will yield the fewest number of comparisons since it’s already a max heap and no swaps take place.

When building a max heap, you only look at the parent nodes. In this case, there are two parent nodes with two comparisons.

1 2 4 3 5 2 1 4 3 5 2 1 3 4 5

[1,2,3,4,5] will yield the most number of comparisons. There are two parent nodes, but you have to perform three comparisons:

4 5 2 3 1 4 2 5 3 1 4 2 3 1 5 1 2 3 4 5

Solution to Challenge 3

Simply use a min heap instead of a max heap before sorting:

let heap = Heap(sort: <, elements: [6, 12, 2, 26, 8, 18, 21, 9, 5])
print(heap.sorted())
Have a technical question? Want to report a bug? You can ask questions and report bugs to the book authors in our official book forum here.
© 2026 Kodeco Inc.