用Swift实现快速排序算法(含动画演示)

QuickSort.gif

快速排序算法是一种时间复杂度为O(nlogn)的算法。

func swap(array:inout [Int], _ leftIndex:Int, _ rightIndex:Int) {
    let temp = array[leftIndex]
    array[leftIndex] = array[rightIndex]
    array[rightIndex] = temp
    return
}

func quickSort(mArray:inout [Int], _ startIndex:Int, _ endIndex:Int) -> [Int] {
    guard mArray.count > 1 else {
        return mArray
    }

    var pivotIndex = endIndex //选最后位置为中心数(pivot)
    var leftIndex = startIndex
    var rightIndex = endIndex - 1
   
    // 如果左右游标相遇,则停止扫描
    while (leftIndex != rightIndex) {
        // 移动左游标, 找到一个大于 pivot 的值
        while (leftIndex < rightIndex && mArray[leftIndex] < mArray[pivotIndex]) {
            leftIndex += 1
        }
        // 移动右游标,找到一个小于 pivot 的值
        while (leftIndex < rightIndex && mArray[rightIndex] > mArray[pivotIndex]) {
            rightIndex -= 1
        }
        
        swap(array: &mArray, leftIndex, rightIndex)
    }
    
    //最后交换 left 和 pivot,使得 pivot 左边都是小于 pivot 的,右边都是大于 pivot
    if (mArray[leftIndex] > mArray[pivotIndex]) {
        swap(array: &mArray, leftIndex, pivotIndex)
        pivotIndex = leftIndex //如果发生交换,中心的位置变成了左右游标相遇的位置
    }

    if (startIndex < pivotIndex - 1) {
//        print("游标左边:")
        quickSort(mArray: &mArray, startIndex, pivotIndex - 1)
    }
    
    if ((pivotIndex + 1) < endIndex) {
//        print("游标右边:")
        quickSort(mArray:&mArray, pivotIndex + 1, endIndex)
    }
    
    return mArray
}

测试用例:

var mArray = [3,1,2,7,9,4,8,5,6]
print(quickSort(mArray: &mArray, 0, mArray.count - 1))

你可能感兴趣的:(用Swift实现快速排序算法(含动画演示))