鱼C论坛

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

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

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

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

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

x
  1. def q(a):
  2.     if len(a) < 2:
  3.         return a
  4.     else:
  5.         less = []
  6.         high = []
  7.         dump = a[0]
  8.         for i in range(1, len(a)):
  9.             if (a[i] <= dump):
  10.                 less.append(a[i])
  11.             else:
  12.                 high.append(a[i])
  13.         # less = [i for i in a[1:] if i <= dump]
  14.         # high = [i for i in a[1:] if i > dump]
  15.     return q(less) + [dump] + q(high)

  16. a = [1, 32, 23, 46, 15, 6, 72]
  17. 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
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

比较两种方法的平均值
小甲鱼最新课程 -> https://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):
小甲鱼最新课程 -> https://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仅生成一次
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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


  1. import time

  2. def timecount(func):

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

  9. @timecount
  10. def rangN(N):
  11.     N = len(N)
  12.     for i in range(N):
  13.         pass

  14. @timecount
  15. def rangLen(N):
  16.     for i in range(len(N)):
  17.         pass

  18. if __name__ == '__main__':
  19.     N = list(range(100000000))
  20.     rangN(N)
  21.     rangLen(N)
复制代码

  1. rangN 运行 6.960397958755493
  2. rangLen 运行 7.127407789230347
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-25 16:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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