python3 快速排序

思路

第一步:找到一个随机的数,一般都是第一个数,也就是left,递归中也用left,放到缓存中,专业叫 基准值,基准值是要放在中间的。

第二步:最左边空出一个位置就是索引left的位置,所以从右向左找比基准值小的索引 R ,找到并将值放在left位置,这样索引R 就会空出来。

第三步:从左向右找比基准值大的索引 L 并将值放在right的位置上。

第四步:循环到left = right,就是基准值的索引,将基准值赋值进去,并返回 基准值索引。

第五步:递归排序基准值左边的列表,

第六步:递归排序基准值右边的列表。

def quit_sort(data, left, right):
    if left < right:
        mid = partition(data, left, right)
        quit_sort(data, left, mid - 1)  # 最左面到中间
        quit_sort(data, mid + 1, right)     # 中间到最后

def partition(data, left, right):
    tmp = data[left]
    while left < right:
        # 从右找到比中间小的值的索引
        while left < right and data[right] > tmp:
            right -= 1
        data[left] = data[right]
        # 从左找到比中间大的索引
        while left < right and data[left] < tmp:
            left += 1
        data[right] = data[left]
    data[left] = tmp
    return left

li = list(range(1000))
random.shuffle(li)
print(li)
quit_sort(li,0,len(li)-1)
print(li)

注:python中有最大的递归层数,如果超过会报错,我们需要设置一下

import sys
sys.setrecursionlimit(10000)

快排的时间复杂度

最好情况 O(nlongn)

一般情况 O(nlongn)

最差情况 O(n2)

时间: 2024-10-16 18:05:09

python3 快速排序的相关文章

Python3实现快速排序、归并排序、堆排序

# -*- coding: utf-8 -*- # @Time : 2019-03-26 16:46 # @Author : Jayce Wong # @ProjectName : leetcode # @FileName : sorting.py # @Blog : https://blog.51cto.com/jayce1111 # @Github : https://github.com/SysuJayce import random def quick_sort(data): "&quo

6.比较排序之快速排序

快速排序(简称快排)因为其效率较高(平均O(nlogn))经常在笔试题中对其考查. 对于快排的第一步是选取一个“基数”,将会用这个“基数”与其它数进行比较交换.而这个“基数”的选择将影响到快排的效率如何,但如果为了选择基数而选择基数则会本末倒置.例如为了找到最佳基数,则需要在整个待排序列中找到中位数,但查找中位数实际上代价又会很高.基数的选择通常来说就是待排序序列中的第一个对象或者中间的一个对象或者最后一个对象.本文以选取第一个元素为例对快排做一个简要分析实现. 以待排序列{6, 5, 3, 1

算法导论 第七章 快速排序(python)

用的最多的排序 平均性能:O(nlogn){随机化nlogn} 原地址排序 稳定性:不稳定 思想:分治 (切分左右) 学习方式:自己在纸上走一遍   def PARTITION(A,p,r): x = A[r] # 锚点 主元{大于它放一边,小于的放另一边} i = p - 1 for j in range(p,r): if A[j] <= x: i += 1 A[i],A[j] = A[j],A[i] A[i+1],A[r] = A[r],A[i+1] return i + 1 def QUI

Python简单的实现快速排序

常见的快排排序:快排实现原理,可以更好理解快排思想 def quick_sort(alist, start, end): if start >= end: return mid = alist[start] left = start right = end # left与right未重合,就向中间移动 while left < right: while left < right and alist[right] >= mid: right -= 1 alist[left] = al

Python3快速入门(十二)——NumPy

Python3快速入门(十二)--NumPy 一.NumPy简介 1.NumPy简介 NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,同时对数组运算提供了大量的数学函数库.Numpy 是一个运行速度非常快的数学库,内部解除了CPython的GIL(全局解释器锁),运行效率极好,主要用于数组计算,是大量机器学习框架的基础库,NumPy主要包括如下:(1)强大的N维数组对象 ndarray(2)广播功能函数(3)整合 C/C++/

十大排序算法总结(Python3实现)

十大排序算法总结(Python3实现) 本文链接:https://blog.csdn.net/aiya_aiya_/article/details/79846380 目录 一.概述 二.算法简介及代码展示 1.冒泡排序 2.简单选择排序 3.简单插入排序 4.堆排序 5.快速排序 6.希尔排序 7.归并排序 8.计数排序 9.桶排序 10.基数排序 11.#代码说明 三.感悟总结 ________________________________________ 一.概述 排序算法大概是hello

ubuntu下卸载python2和升级python3.5

卸载python只需一条语句就可以实现 sudu apt-get remove python ubuntu下安装python3 sudo apt-get install python3 但这样只安装了python3.4 要想使用python3.5,则必须升级python3.4 sudo add-apt-repository ppa:fkrull/deadsnakes sudo apt-get update sudo apt-get install python3.5 使用以上三行命令便可升级py

快速排序

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 快速排序是一种不稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). 该方法的基本思想是:

python3 装饰器

看廖雪峰官网的python3装饰器有感 装饰器即将一个函数作为变量在新的函数中调用此函数. 作业: 能否写出一个@log的decorator,使它既支持: @logdef f():     pass 又支持: @log('execute')def f():     pass      例1: import functools import time def log(*args,**kwargs):     # *args 是个元组     if args and isinstance(args,