Algoritmo - algoritmo de classificação rápida

O algoritmo de classificação rápida é famoso por ser "rápido" e é considerado um algoritmo de classificação clássico na indústria devido à sua excelente complexidade de tempo. Também é frequentemente usado em entrevistas. Se você puder escrever o algoritmo de classificação rápida manualmente durante a entrevista , será um bônus deslumbrante.
O algoritmo de classificação rápida não é difícil. Ele usa as ideias de pesquisa binária e divisão e conquista para dividir os limites do problema e transformá-lo em problemas menores para resolver.

rápido:

import Foundation

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

/*
 快速排序主函数 二分查找、分治思想
 */
func quickSort (array: inout [Int], startIndex: Int, endIndex: Int) {
    
    
    if startIndex > endIndex {
    
     return }
    let mid = partition(array: &array, startIndex: startIndex, endIndex: endIndex)
    quickSort(array: &array, startIndex: startIndex, endIndex: mid - 1) //左区间分治
    quickSort(array: &array, startIndex: mid + 1, endIndex: endIndex)   //右区间分治
}

/*
 分治函数
 @return 分隔左右区间的index
 保证 arr[index] > index左边的数,arr[index] < index右边的数
 */
func partition (array: inout [Int], startIndex: Int, endIndex: Int) -> Int {
    
    
    var left = startIndex
    var right = endIndex
    let standNum = array[startIndex]    //找到基准数(也称哨兵)
    while left < right {
    
    
        //从右到左 找到第一个小于 基准数 的数
        while left < right, array[right] >= standNum {
    
    	//这里要有等号,防止排序数组中出现重复数字陷入死循环
            right -= 1
        }
        array[left] = array[right]
        
        //从左到右 找到第一个大于 基准数 的数
        while left < right, array[left] <= standNum {
    
    
            left += 1
        }
        array[right] = array[left]
    }
    array[left] = standNum
    return left
}

Resultado de impressão: Imprimir resultados
Complexidade de tempo: O(n log(n))

Acho que você gosta

Origin blog.csdn.net/weixin_44758107/article/details/127685900
Recomendado
Clasificación