【Python实现快排】 -- 2019-08-09 12:12:36

原文: http://106.13.73.98/__/117/

挖坑法思路:

  • 取一个元素p(第一个元素),使元素p归位;
  • 列表被p分成两部分,左边的数一定不大于p,右边的数一定不小于p;
  • 递归完成排序。

Python代码示例:

lst = [5, 7, 4, 3, 1, 2, 9, 8]

def quick_sort(d, l, r):
    if l < r:
        m = partition(d, l, r)
        quick_sort(d, l, m - 1)
        quick_sort(d, m + 1, r)

def partition(d, l, r):
    # 挖坑法,函数执行结束后,左边的数一定不大于p,右边的数一定不小于p
    p = d[l]
    while l < r:
        while l < r and d[r] >= p:
            r -= 1
        d[l] = d[r]
        while l < r and d[l] <= p:
            l += 1
        d[r] = d[l]
    d[l] = p
    return l

quick_sort(lst, 0, len(lst) - 1)


《算法导论》中的快速排序:

class QuickSort(object):
    __INSTANCE = None

    def __new__(cls, *args, **kwargs):
        """单例模式"""
        if not cls.__INSTANCE:
            cls.__INSTANCE = object.__new__(cls)
        return cls.__INSTANCE

    def __init__(self, data):
        self.__quick_sort(data, 0, len(data) - 1)

    def __quick_sort(self, d, l, r):
        if l < r:
            q = self.__partition(d, l, r)
            self.__quick_sort(d, l, q - 1)
            self.__quick_sort(d, q + 1, r)

    def __partition(self, d, l, r):
        x = d[r]  # last value
        i = l - 1  # last index
        for j in range(l, r):
            if d[j] <= x:
                i += 1
                d[i], d[j] = d[j], d[i]
        d[i + 1], d[r] = d[r], d[i + 1]
        return i + 1

QuickSort(lst)

原文: http://106.13.73.98/__/117/

原文地址:https://www.cnblogs.com/gqy02/p/11326456.html

时间: 2024-08-03 10:49:34

【Python实现快排】 -- 2019-08-09 12:12:36的相关文章

Python的快排应有的样子

快排算法 ? 简单来说就是定一个位置然后,然后把比它小的数放左边,比他大的数放右边,这显然是一个递归的定义,根据这个思路很容易可以写出快排的代码 ? 快排是我学ACM路上第一个让我记住的代码,印象很深刻,以前学的是Pascal,写这个要写好长一串,但是因为和归并排序比起来还算短的,也就背下来了.好奇的我点开百科看python的快排代码,就看到了如下代码: #quick sort def quickSort(L, low, high): i = low j = high if i >= j: re

Python 实现快排

快速排序简介快速排序,又称划分交换排序,从无序队列中挑取一个元素,把无序队列分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列.简单来说:挑元素.划分组.分组重复前两步 快速排序原理示意图通过上面对快速排序的简介,我们知道了,快速排序主要包括以下两方面:挑元素划分组.整体递归分组挑元素划分组示意图: 特点:1.因为是无序队列,所以位置可以随机挑2.临时划分一个空间,存放我们挑

觉得python写快排真的简单易懂

记录下自己学习python的学习路 快速排序: def mySort(l): if len(l)<2:#如果列表中只有一个元素就会返回 return l num=l[0]#拿一个元素作为参考元素 startl=[x for x in l[1:] if x <= num ]#使用列表推导式把小于等于参考元素的放入新的列表 endl=[x for x in l[1:] if x > num ]#使用列表推导式把大于参考元素的放入新的列表 #使用递归的方式将排序好的元素拼接为新的列表返回 re

2019 08 09 函数扩展

可变长参数 可变长参数:指的是在调用函数时,传入的参数个数可以不固定 调用函数时,传值的方式无非两种,一种是位置实参,另一种是关键字实参,因此形参也必须得有两种解决方法,以此来分别接收溢出的位置实参(*)与关键字实参(**) 一.可变长形参之* 形参中的会将溢出的位置实参全部接收,然后存储元组的形式,然后把元组赋值给后的参数.需要注意的是:*后的参数名约定俗成为args. def sum_self(*args): res = 0 for num in args: res += num retur

【Python实现快排】 &#202465;

原文: http://blog.gqylpy.com/gqy/342 " 挖坑法思路: 取一个元素p(第一个元素),使元素p归位: 列表被p分成两部分,左边的数一定不大于p,右边的数一定不小于p: 递归完成排序. Python代码示例: lst = [5, 7, 4, 3, 1, 2, 9, 8] def quick_sort(d, l, r): if l < r: m = partition(d, l, r) quick_sort(d, l, m - 1) quick_sort(d, m

Python随笔-快排

def swap(arr, i, j): temp = arr[i] arr[i] = arr[j] arr[j] = temp def part(arr, beg, end): if end - beg <= 0: return beg v = arr[beg] idx = beg + 1 for x in range(beg+1, end+1): if(arr[x] < v): swap(arr, idx, x) idx += 1 swap(arr, idx-1, beg) return

2019.08.09考试报告

写在前面:穿校服真心有用啊,能加rp.说实话考的还不错,又回到了原来的状态了. (为了防止Deepinc认为博主能6分钟敲完一套对拍+正解,我还是把考试时间写清楚点吧.) 0h: 贪吃了一个雪糕导致迟到了...迎面撞上波波... 0-1h: T1打了一个错解,对拍刚开始没问题,便去看T2,看到一半的时候对拍n,m,k<=30出现了负数答案, 只好回来改T1,发现自己的式子是假的,多减了许多东西,便想到了容斥这个操作,10分钟推了推式子, 过了刚才出错了的数据,状态倍增. 1-2h: 打了T2的贪

python 冒泡和快排,不多说【无聊】

1 #-*-coding:utf8-*- 2 import random 3 a=[] 4 b=[] 5 def init_array(): 6 for i in range(10000): 7 v = random.randint(1,10000) 8 a.append(v) 9 b.append(v) 10 11 #冒泡 12 def sort_array(a): 13 for i in range(len(a)): 14 for j in range(i+1,len(a)): 15 if

Python实现排序(冒泡、快排、归并)

Thomas H.Cormen 的<算法导论>上介绍的几个经典排序算法的Python实现. 1.冒泡排序: 简单的两重循环遍历,使最小(最大)的值不断地往上升(下沉)而实现的排序,算法时间为O(n2). 代码如下: 1 def up_sort(a): 2 # 冒泡排序 3 4 a_length = len(a) 5 while True: 6 i = 0 7 j = 1 8 9 while True: 10 if a[i] > a[j]: 11 a[i], a[j] = a[j], a[