鱼C论坛

 找回密码
 立即注册
查看: 2062|回复: 5

[已解决]不懂就问,这样写快速排序效率是不是更高点?

[复制链接]
发表于 2021-4-3 15:12:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def q(a):
    if len(a) < 2:
        return a
    else:
        less = []
        high = []
        dump = a[0]
        for i in range(1, len(a)):
            if (a[i] <= dump):
                less.append(a[i])
            else:
                high.append(a[i])
        # less = [i for i in a[1:] if i <= dump]
        # high = [i for i in a[1:] if i > dump]
    return q(less) + [dump] + q(high)

a = [1, 32, 23, 46, 15, 6, 72]
print(q(a))

注释的地方是《算法图解》里的代码,但是我觉得没必要遍历两次
最佳答案
2021-4-4 11:00:31
本帖最后由 Stubborn 于 2021-4-4 11:04 编辑

原来上来说  O  和 2O的时间效率都等于O 。

还有一个小建议:

for i in range(1, len(a)):

变为,可以减少每次运行len的时间
N =  len(a)
for i in range(1, N):
快速排序.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-3 15:30:08 | 显示全部楼层
可以算100个数,然后看运行时间

重复100次,计算运行时间的平均值

比较两种方法的平均值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-4 11:00:31 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Stubborn 于 2021-4-4 11:04 编辑

原来上来说  O  和 2O的时间效率都等于O 。

还有一个小建议:

for i in range(1, len(a)):

变为,可以减少每次运行len的时间
N =  len(a)
for i in range(1, N):
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-4-4 11:26:40 From FishC Mobile | 显示全部楼层
Stubborn 发表于 2021-4-4 11:00
原来上来说  O  和 2O的时间效率都等于O 。

还有一个小建议:

for循环应该不会重复运行len,因为range仅生成一次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-4 11:44:03 | 显示全部楼层
本帖最后由 Stubborn 于 2021-4-4 11:47 编辑
hrp 发表于 2021-4-4 11:26
for循环应该不会重复运行len,因为range仅生成一次


N小的时候没有什么差别,不用太在意,大的时候,尽量别用,可以节省一些时间
import time

def timecount(func):

    def wapperd(*args, **kwargs):
        s = time.time()
        func(*args, **kwargs)
        t = time.time() - s
        print(f"{func.__name__} 运行 {t} ")
    return wapperd

@timecount
def rangN(N):
    N = len(N)
    for i in range(N):
        pass

@timecount
def rangLen(N):
    for i in range(len(N)):
        pass

if __name__ == '__main__':
    N = list(range(100000000))
    rangN(N)
    rangLen(N)
rangN 运行 6.960397958755493 
rangLen 运行 7.127407789230347 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-4 13:26:59 From FishC Mobile | 显示全部楼层
Stubborn 发表于 2021-4-4 11:44
N小的时候没有什么差别,不用太在意,大的时候,尽量别用,可以节省一些时间


我突然想起来  代码简洁之道  里写的:尽量不要用嵌套语句,嵌套语句运行比分步运行慢一点(大致意思)。难道这就是rangLen比rangN慢的原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 03:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表