"Quicksort — Lomuto partition. Sorts an Array in place. Classic-corpus
 program for the Smalltalk-on-SX runtime."

Object subclass: #Quicksort
  instanceVariableNames: ''!

!Quicksort methodsFor: 'sort'!
sort: arr ^ self sort: arr from: 1 to: arr size!

sort: arr from: low to: high
  | p |
  low < high ifTrue: [
    p := self partition: arr from: low to: high.
    self sort: arr from: low to: p - 1.
    self sort: arr from: p + 1 to: high].
  ^ arr!

partition: arr from: low to: high
  | pivot i tmp |
  pivot := arr at: high.
  i := low - 1.
  low to: high - 1 do: [:j |
    (arr at: j) <= pivot ifTrue: [
      i := i + 1.
      tmp := arr at: i.
      arr at: i put: (arr at: j).
      arr at: j put: tmp]].
  tmp := arr at: i + 1.
  arr at: i + 1 put: (arr at: high).
  arr at: high put: tmp.
  ^ i + 1! !
