python中快速排序算法

相比归并排序来说快速排序在数据量小的情况下是不占优势的,因为快速排序的时间复杂度最好的情况下是n(log n),但是在处理大量数据的时候归并排序就不如时间排序了,因为在空间复杂度上面归并排序消耗资源更多.
所以我们可以做一个判断 如果列表长度小于某个数值的时候走if分支 而大于某个值的时候走else分支.

def QuickSort(array, left=0, right=None):
    #获取数组的长度
    arrayLen = len(array)
    #如果数组的长度小于等于1 则把结束当前递归 返回该数组
    if arrayLen <= 1:
        return array
    #如果右边是None 则说明是刚开始初始化 把数组的总长度减一(总长度的下标) 赋值给右边
    if right == None:
        right = arrayLen - 1
    #如果左边小于右边 说明还没有达到分治的标准  继续递归 否则跳出
    if left < right:
        #把数组和当前层的左边指针和右边指针传递给函数进行处理
        pivot = partition(array, left, right)

        #例如  左表[2, 7, 6, 1]   锚点[3]   右表[5, 4, 9]
        #把接收到的锚点作为分支的标准 先想作为(左表的)右边界传值
        QuickSort(array, left, pivot - 1)
        #把接受到的锚点 作为右表的左边界 处理
        QuickSort(array, pivot + 1, right)
#处理传递过来的数组
def partition(array, left, right):
    #获取数组中最右边的值 作为锚点
    pivotValue = array[right]
    #得到左边的起始指针  和右边的结束指针
    i = left
    j = right - 1
    #如果起始指针大于结束指针 终止循环
    while i < j:
        #当右边大于左边指针的位置 并且右边的值大于 锚点值的时候
        while j > left and array[j] > pivotValue:
            #右边的指针位置向左移动一位
            j -= 1
        # 当左边小于右边指针的位置 并且左边的值小于等于 锚点值的时候
        while i < right and array[i] <= pivotValue:
            #左边的指针位置向右移动一位
            i += 1
        #如果左边指针的位置小于右边
        if i < j:
            #交换两个数值的位置
            array[i], array[j] = array[j], array[i]
    #如果左边指针对应的值大于右边指针对应的值
    if array[i] > array[right]:
        #交换两个数值的位置
        array[i], array[right] = array[right], array[i]
    return i
if __name__ == '__main__':
    testList = [2, 7, 6, 1, 5, 4, 9, 3]
    QuickSort(testList)
    print(testList)

第二种快速排序写法:

def partition(array, left, right):
    i = left - 1
    for j in range(left, right):
        if array[j] <= array[right]:
            i += 1
            array[j], array[i] = array[i], array[j]
    array[i+1], array[right] = array[right], array[i+1]
    return i+1
def QuickSort(array, left=0, right=None):
    arrayLen = len(array)
    if arrayLen <= 1:
        return array
    if left < right:
        pivot = partition(array, left ,right)
        QuickSort(array, left, pivot - 1)
        QuickSort(array, pivot + 1, right)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值