• 10.快排


    1.1 快排-递归实现

    **注:**快排代码实现(类似于二叉树 递归调用)----右手左手一个慢动作,左手右手一个慢动作重播

    空间复杂度 O(1)
    
    
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import random
    import sys
    sys.setrecursionlimit(10000000)             #设置系统最大递归深度
    
    def quick_sort(data, left, right):
        if left < right:
            mid = partition(data, left, right)    # mid返回的是上一个用来排序那个数的下标
            quick_sort(data, left, mid - 1)
            quick_sort(data, mid + 1,right)
    
    # 每执行一次partition函数都可以实现将某个数左边都比这个数小右边都比这个数大
    def partition(data, left, right):
        tmp = data[left]
        while left < right:
            while left < right and data[right] >= tmp:     # 从右向左找小于tmp的数放到左边空位置
                right -= 1
            data[left] = data[right]                       # 将右边小于tmp值得数放到左边空位置
            while left < right and data[left] <= tmp:      # 从左向右找到大于tmp的值放到右边空位置
                left += 1
            data[right] = data[left]                       # 将右边大于tmp值得数放到右边空位置
        data[left] = tmp
        return left
    
    data = list(range(100))
    random.shuffle(data)                                 #将有序列表打乱
    quick_sort(data, 0, len(data) - 1)
    print(data)

    1.2 快排-简单实现

    空间复杂度高(O(N)):需要开辟新的列表存储
    
    
    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    def quick(list):
        if len(list) < 2:
            return list
    
        tmp = list[0]  # 临时变量 可以取随机值
        left = [x for x in list[1:] if x <= tmp]  # 左列表
        right = [x for x in list[1:] if x > tmp]  # 右列表
        return quick(left) + [tmp] + quick(right)
    
    li = [4,3,7,5,8,2]
    print quick(li)  # [2, 3, 4, 5, 7, 8]
    
    #### 对[4,3,7,5,8,2]排序
    '''
    [3, 2] + [4] + [7, 5, 8]                 # tmp = [4]
    [2] + [3] + [4] + [7, 5, 8]              # tmp = [3] 此时对[3, 2]这个列表进行排序
    [2] + [3] + [4] + [5] + [7] + [8]        # tmp = [7] 此时对[7, 5, 8]这个列表进行排序
    '''
  • 相关阅读:
    40个GitHub上最受欢迎的iOS开源项目
    Swift应用开源项目推荐
    swift在github上开源的地址
    必须Mark!43个优秀的Swift开源项目推荐
    Swift中编写单例的正确方式
    Android提高第十一篇之模拟信号示波器
    Android平台音频信号FFT的实现
    ios UINavigationController
    工作记录8:iOS 传值问题总结(7种传值完美介绍)
    利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值
  • 原文地址:https://www.cnblogs.com/xiaoxiamiaichiyu/p/14586931.html
Copyright © 2020-2023  润新知