为什么采访者对Swift 4中的QuickSort实现不满意?

时间:2018-05-07 18:51:37

标签: swift quicksort

昨天,在一名初级iOS开发人员的求职面试中,我被要求实施QuickSort算法。

我写了这个:

func sort<T: Comparable>(_ array: Array<T>) -> Array<T> {

    let arraySize = array.count

    guard arraySize > 1 else { return array }

    let pivot = array[arraySize / 2]

    var less = [T]()
    var equal = [T]()
    var greater = [T]()

    for element in array {

        if element < pivot {
            less.append(element)
        } else if element > pivot {
            greater.append(element)
        } else {
            equal.append(element)
        }

    }

    return sort(less) + equal + sort(greater)

}

他们说这不是QuickSort,而是一些 quicksortish 版本。 尽管我让他们解释,他们建议回家搜索真正的算法。

就像你是面试官一样,你对我的代码有什么看法?

1 个答案:

答案 0 :(得分:0)

您应该就地执行。选择最后一项作为枢轴,将所有小于枢轴的项放在左侧,将其他相等且较大的项放在右侧,然后将枢轴放在其位置。

您可以选择任何项目作为枢轴,但是在每次迭代中都应将枢轴放置在正确的位置,并且小于枢轴的数字应在左侧,其他应在右侧。

func quickSort<T: Comparable>(array: inout [T]) {
    quickSort(array: &array, startIndex: 0, endIndex: array.count-1)
}

func quickSort<T: Comparable>(array: inout [T], startIndex: Int, endIndex: Int) {
    if startIndex >= endIndex {
        return
    }
    let itemIndex = partition(array: &array, startIndex: startIndex, endIndex: endIndex)
    quickSort(array: &array, startIndex: startIndex, endIndex: itemIndex-1)
    quickSort(array: &array, startIndex: itemIndex+1, endIndex: endIndex)
}

func partition<T: Comparable>(array: inout [T], startIndex: Int, endIndex: Int) -> Int {
    var i = startIndex
    for index in startIndex..<endIndex {
        if array[index] < array[endIndex] {
            array.swapAt(i, index)
            i += 1
        }
    }
    array.swapAt(i, endIndex)
    return i
}