昨天,在一名初级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 版本。 尽管我让他们解释,他们建议回家搜索真正的算法。
就像你是面试官一样,你对我的代码有什么看法?
答案 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
}