ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python快速排序板子 分而治之

2022-01-17 09:33:39  阅读:229  来源: 互联网

标签:基准值 Python 分而治之 代码 quicksort list len 板子 基线


目录

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

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


一:所谓分而治之(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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有