Алгоритмы / Сортировка

// Time Complexity from O(n log(n)) to O(n^2)
// Space Complexity O(log(n))

func doSort(_ items: inout [Int], _ fst: Int, _ lst: Int) {
    if fst >= lst {
        return
    }
    var i = fst
    var j = lst
    let x = items[(fst + lst)/2]

    while (i < j) {
        while items[i] < x { i+=1 }
        while items[j] > x { j-=1 }
        if (i <= j) {
            let tmp = items[i]
            items[i] = items[j]
            items[j] = tmp
            i+=1
            j-=1
        }
    }
    doSort(&items, fst, j)
    doSort(&items, i, lst)
}

func sort(_ arr: [Int]) -> [Int]
{
    var items = arr
    doSort(&items, 0, items.count - 1)
    return items
}


var items = [ 41532 ]

var sortItems = sort(items)
// sortItems is {1, 2, 3, 4, 5}
print(sortItems)

// *** simplified speed test ***
items = [Int](repeating: 0, count: 200)
for i in 0 ..< items.count {
    items[i] = i
}
let tmp = items[5]
items[5] = items[6]
items[6] = tmp

let count = 100
let start = Date()

for _ in 0 ..< count {
    sortItems = sort(items)
}

let seconds = abs(start.timeIntervalSinceNow)

print(sortItems)
print(seconds)
// about 0.008698 seconds