菜鸟教程 -- 学的不仅是技术,更是梦想!

Python 3 教程
Python3 教程 Python3 简介 Python3 环境搭建 Python3 VScode Python3 基础语法 Python3 基本数据类型 Python3 数据类型转换 Python3 解释器 Python3 注释 Python3 运算符 Python3 数字(Number) Python3 字符串 Python3 列表 Python3 元组 Python3 字典 Python3 集合 Python3 条件控制 Python3 循环语句 Python3 编程第一步 Python3 推导式 Python3 迭代器与生成器 Python3 with Python3 函数 Python3 lambda Python3 装饰器 Python3 数据结构 Python3 模块 Python __name__ Python3 输入和输出 Python3 File Python3 OS Python3 错误和异常 Python3 面向对象 Python3 命名空间/作用域 Python 虚拟环境的创建 Python 类型注解 Python3 标准库概览 Python3 实例 Python 测验

Python3 高级教程

Python3 正则表达式 Python3 CGI编程 Python3 MySQL(mysql-connector) Python3 MySQL(PyMySQL) Python3 网络编程 Python3 SMTP发送邮件 Python3 多线程 Python3 XML 解析 Python3 JSON Python3 日期和时间 Python3 内置函数 Python3 MongoDB Python3 urllib Python uWSGI 安装配置 Python3 pip Python3 operator Python math Python requests Python random Python OpenAI Python 有用的资源 Python AI 绘画 Python statistics Python hashlib Python 量化 Python pyecharts Python selenium 库 Python 爬虫 Python Scrapy 库 Python Markdown Python sys 模块 Python Pickle 模块 Python subprocess 模块 Python queue 模块 Python StringIO 模块 Python logging 模块 Python datetime 模块 Python re 模块 Python csv 模块 Python threading 模块 Python asyncio 模块 Python PyQt Python for 循环 Python while 循环
(追記) (追記ここまで)

Python 快速排序

Document 对象参考手册 Python3 实例

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。

步骤为:

  • 挑选基准值:从数列中挑出一个元素,称为"基准"(pivot);
  • 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成;
  • 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。

递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。

选取基准值有数种具体方法,此选取方法对排序的时间性能有决定性影响。

实例

defpartition(arr,low,high): i = (low-1)# 最小元素索引pivot = arr[high]forjinrange(low , high): # 当前元素小于或等于 pivot ifarr[j] <= pivot: i = i+1arr[i],arr[j] = arr[j],arr[i]arr[i+1],arr[high] = arr[high],arr[i+1]return(i+1)# arr[] --> 排序数组# low --> 起始索引# high --> 结束索引# 快速排序函数defquickSort(arr,low,high): iflow < high: pi = partition(arr,low,high)quickSort(arr, low, pi-1)quickSort(arr, pi+1, high)arr = [10, 7, 8, 9, 1, 5]n = len(arr)quickSort(arr,0,n-1)print("排序后的数组:")foriinrange(n): print("%d" %arr[i]),

执行以上代码输出结果为:

排序后的数组:
1
5
7
8
9
10

Document 对象参考手册 Python3 实例

AI 思考中...

5 篇笔记 写笔记

  1. #0

    alisa_l_zhang

    187***[email protected]

    354

    参考内容:

    def quicksort(arr): 
     if len(arr) <= 1: 
     return arr 
     pivot = arr[len(arr) // 2] 
     left = [x for x in arr if x < pivot] 
     middle = [x for x in arr if x == pivot] 
     right = [x for x in arr if x > pivot] 
     return quicksort(left) + middle + quicksort(right)
    print(quicksort([3, 6, 8, 19, 1, 5])) # [1,3, 5, 6, 8, 19]
    

    alisa_l_zhang

    187***[email protected]

    7年前 (2019年10月08日)
  2. #0

    LYLM

    109***[email protected]

    14

    考上面的笔记,综合了一下。(以最后列表最后一个元素作pivot)

    def quickSort(aList):
     if len(aList) <= 1:
     return aList
     pivot = aList[len(aList)-1]
     pivot = -1
     for index,item in enumerate(aList):
     if item < pivot:
     pivot += 1
     aList[pivot], aList[index] = aList[index], aList[pivot]
     pivot = pivot + 1
     aList[pivot], aList[index] = aList[index], aList[pivot]
     left = quickSort(aList[:pivot]) 
     middle = [aList[pivot]]
     right = quickSort(aList[pivot+1:])
     newList = left+middle+right
     return newList
     
    theList = [123,45,32,555,64,31,45,50,658,55,1,45]
    result = quickSort(theList)

    LYLM

    109***[email protected]

    7年前 (2020年01月03日)
  3. #0

    hjklo

    123***[email protected]

    37

    使用递归、分治思想的快速排序:

    def quickSort(arr):
     if(len(arr)<2): #不用进行排序
     return arr
     else:
     pivot=arr[0]
     less=[i for i in arr[1:] if(i<=pivot)]
     great=[i for i in arr[1:] if(i>pivot)]
     return quickSort(less)+[pivot]+quickSort(great)
    arr=[1,4,5,2,41,4,24,5]
    print("原始数据:",arr)
    print("排序后的数据:",quickSort(arr))

    hjklo

    123***[email protected]

    6年前 (2020年04月27日)
  4. #0

    风之语故乡

    272***[email protected]

    10

    内存消耗小,时间复杂度稳定,不改变原有元素类型(比如是numpy),速度也快.(1000000个数据大约5秒多)

    def quickSort(arr):
     len_ = len(arr)
     if len_ <= 1:
     return
     pivot = arr[len_//2] # 基准数为中间元素,中间元素位置空出来,一定要用中间元素为基准,
     # 若取第一或末尾,对排好顺序的序列,时间复杂度会变成指数O(n^2)
     arr[len_//2] = arr[0] # 中间空位放入第一个元素,此时第一元素的位置空出来
     left = 0 # 左边界(边界之外是已经处理好的元素,边界之内是未处理的元素)
     right = len_-1 # 右边界
     # 当左侧有空位时,从最右侧找出小于基准的元素放入空位,当右侧有空位时,从左侧找出大于基准的
     is_cell_left = True # 空位在左侧
     while (left < right):
     if is_cell_left: # 空位在左侧
     if(arr[right] >= pivot): # 如果右侧元素>=基准
     right -= 1 # 右边界缩小
     else:
     arr[left] = arr[right] # 右侧元素放入空位
     left += 1
     is_cell_left = False # 空位在右侧
     else: # 空位在右侧
     if(arr[left] <= pivot): # 如果左侧元素>=基准
     left += 1 # 左边界缩小
     else:
     arr[right] = arr[left] # 左侧元素放入空位
     right -= 1
     is_cell_left = True # 空位在左侧
     arr[left] = pivot
     quickSort(arr[:left])
     quickSort(arr[left+1:])

    风之语故乡

    272***[email protected]

    4年前 (2022年02月22日)
  5. #0

    Gbosh

    ge1***[email protected]

    2

    参考方法:

    def quick_sort(alist, start, end):
     """快速排序"""
     if start >= end: # 递归的退出条件
     return
     mid = alist[start] # 设定起始的基准元素
     low = start # low为序列左边在开始位置的由左向右移动的游标
     high = end # high为序列右边末尾位置的由右向左移动的游标
     while low < high:
     # 如果low与high未重合,high(右边)指向的元素大于等于基准元素,则high向左移动
     while low < high and alist[high] >= mid:
     high -= 1
     alist[low] = alist[high] # 走到此位置时high指向一个比基准元素小的元素,将high指向的元素放到low的位置上,此时high指向的位置空着,接下来移动low找到符合条件的元素放在此处
     # 如果low与high未重合,low指向的元素比基准元素小,则low向右移动
     while low < high and alist[low] < mid:
     low += 1
     alist[high] = alist[low] # 此时low指向一个比基准元素大的元素,将low指向的元素放到high空着的位置上,此时low指向的位置空着,之后进行下一次循环,将high找到符合条件的元素填到此处
     # 退出循环后,low与high重合,此时所指位置为基准元素的正确位置,左边的元素都比基准元素小,右边的元素都比基准元素大
     alist[low] = mid # 将基准元素放到该位置,
     # 对基准元素左边的子序列进行快速排序
     quick_sort(alist, start, low - 1) # start :0 low -1 原基准元素靠左边一位
     # 对基准元素右边的子序列进行快速排序
     quick_sort(alist, low + 1, end) # low+1 : 原基准元素靠右一位 end: 最后
    alist = [3, 6, 8, 19, 1, 5]
    quick_sort(alist, 0, len(alist) - 1)
    print(alist) # 输出 [1, 3, 5, 6, 8, 19]

    Gbosh

    ge1***[email protected]

    4年前 (2022年09月14日)

点我分享笔记

  • 昵称 (必填)
  • 邮箱 (必填)
  • 引用地址

AltStyle によって変換されたページ (->オリジナル) /