编程语言
首页 > 编程语言> > Python快速排序板子 分而治之

Python快速排序板子 分而治之

作者:互联网

目录

一:个人阅读完《算法图解》快速排序后写的代码

二:参考官方代码及个人总结


一:所谓分而治之(divide and conquer,D&C)是一种递归式解决方法

工作原理:(1)找出简单的基线条件(2)确定如何缩小问题规模使其符合基线条件

下面以一个例子来解释[源自算法图解]:

 

相信聪明的你看到这里大致就清晰了,如果还是不懂想看到最后可以找我给你pdf版的算法图解哈

(我本人是使用纸质的学习起来比较方便)

快速排序分析 :简言之就是给你一个列表 取一个元素作为基准值,大的放它左(右)边,小的放它右(左)边,再对两侧列表快速排序,再取基准值.....不断缩小规模

个人代码: 

#基线条件 分区
def sorta(list):
    if len(list)==1:
        return list
    elif len(list)==0:
        return []
    else:
        start,end=0,len(list)-1
        mid=(start+end)//2
        left,right=[],[]
        for i in list:
            if i!=list[mid]:
                if i<=list[mid] :
                    left.append(i)
                else:
                    right.append(i)
        return sorta(left)+[list[mid]]+sorta(right)

个人写的还是很冗长,对比了官方代码,总结了以下几点:

1:基准值的选取对排序影响不大,为简便起见选择首元素作为基准值(我一开始以为和对分查找有什么关系= =)

2:基线条件就是len(list)<2,一开始担心万一调用自身时传入的参数对报错(传入一个什么都没有的东西)后来发现 已经创建了left right>>list  那么经历基线条件是参数就没有问题

3:列表解析式会更加简洁效率更高!将四行代码换成一行0.0!!

#写法1
less=[i for i in array[1:] if i<=pivot]
print(less)
#下面是写法2:
less=[]
for i in array[1:]:
    if i<=pivot:
        less.append[i]
print(less)

官方代码(宝藏) :

def quicksort(array):
    if len(array)<2:
        return array#每次递归调用自身 参数一定是列表 基线条件:单元素列表和空列表都返回自身
    else:
         pivot=array[0]#选择哪个元素作为基准值都可以
         less=[i for i in array[1:] if i<=pivot]
         greater=[i for i in array[1:] if i>pivot]#优势在于省去了append,因为‘分区’不包括mid,这里利用切片使得代码更加简介
         return quicksort(less)+[pivot]+quicksort(greater)

#print(quicksort([1,4332,43,2,-2,-9,100000]))
#输出[-9, -2, 1, 2, 43, 4332, 100000]

好啦 我是小郑 希望和你在Python与编程的路越走越远 今天蓝桥杯倒计时

 

标签:基准值,Python,分而治之,代码,quicksort,list,len,板子,基线
来源: https://blog.csdn.net/m0_62277756/article/details/122532772