设为首页 收藏本站
查看: 1032|回复: 0

[经验分享] python实现快速排序

[复制链接]

尚未签到

发表于 2015-4-26 08:16:32 | 显示全部楼层 |阅读模式
  快速排序可以把时间复杂度优化到nlog2n,省心多了。。。
  来八卦一下快速排序
  1. 快速排序就是选定一个标志位,我们把它叫做flag,期望把小于flag的放在它的左边,把大于flag的放在它的右边,这样就以flag的分界,把原来的list分为了两个子list : list1 和 list2。
  2. 按照上述方法,在list1 和 list2中再分别选flag,将list2 和 list2 分别拆成两个list,依次类推
  3. 直到n = 1,即每个子list都只有一个元素  整个过程 : n/2x = 1  x = log2n

  那么如何实现step1呢,既然有的元素比flag大,有的元素比flag小,那么我们定义两个游标,一个指向大于flag的元素,一个指向小于flag的元素,选定list中的最后一个元素作为flag
  list = [5,1,3,8,9,4,7,6]
  (整个过程,可以在纸上先写一写,分析一下就很清楚了)
  在上面的列表中,选择list[-1] = 6作为flag位,定义游标 i 和游标 j ,i指向大于flag的元素,j指向小于flag的元素。
  Step1 :将 i 初始化到-1 位置,将 j 初始化到 0 位置
  Q:为什么将 i 初始化到-1位置,即指向列表前面一个空的位置?
  A:等下解释。。。
  Step2:j :0——>len(list)-1
  比较list[j]和flag,在例子中,现在j=0,list[0] < flag,这时候 i= i+1, exchange list 和 list[j]的值
  Q:现在 i 和 j 指向的都是0的位置,为什么自己要和自己交换呢?
  A:可以在代码中看到,这样做其实是为了保持程序的一致性,当然你也可以自己判断,如果i 和 j 指向的都是同一个位置,那没必要交换
  Step3:j++,到了j=(index)3的时候,这时候 i 还是指向(index)2的,发现,list[j=3] = 8 是大于flag的,那么,i 原地不动 ,即现在i 还是指向index=2的位置,i 不往前走了。
  Step4:当 j 走到5的时候,list[5] = 4,它小于flag ,而它前面的8 和 9 都比flag大,那么,也肯定比list[5] = 4要大了,好,i+1,即 i 现在指向(index)3,即value=8,exchange list 和 list[j],然后j 继续向前走。
  总之,j 先走,只要碰到小于flag的数,i 就+1,只要碰到大于flag的数,i 就原地不动,j 继续向前走,目前就是把后面小的数给挪到前面来。
  现在,来解释一下为什么将i 初始化到 -1 的位置呢?
  很简单,当第一个位置的元素大于flag时,i 指向0,原地不动,而j 继续向前走,当遇到下面一个比flag小的元素时,i+1,那么,你就永远处理不到第一个元素了,嗯,就是这个原因,可以自己在纸上写一下,一下子就看出来了。
  上面的过程可以用下面的代码实现;
  



1 if __name__ == '__main__':
2     l = [5,1,3,8,9,4,7,6]
3
4     def first_sort(l):
5         flag = l[-1]
6         i = -1
7         for j in range(len(l)-1):
8             if l[j] > flag:
9                 pass
10             else:
11                 i += 1
12                 tmp = l
13                 l = l[j]
14                 l[j] = tmp
15         print(l)
16         print("\n" + "*"*20 + "\n")
17
18         tmp = l[-1]
19         l[-1] = l[i+1]
20         l[i+1] = tmp
21
22         print(l)
23         print("\n" + "*"*20 + "\n")
24
25     first_sort(l)
  
  运行后的结果为:



[5, 1, 3, 4, 9, 8, 7, 6]
********************
[5, 1, 3, 4, 6, 8, 7, 9]
********************
  从第一个打印出的list来看,小于flag的和大于flag的已经分开了
  将list[-1] 和 list[i+1] 交换,那么第一次快排就完成了,(运行结果的第二条)
  清楚了这个过程以后,接下来就是递归的事儿了,呃,不想写了,好累。。。直接贴代码。



1     def path_sort(list,start_index,end_index):
2         flag = list[end_index]
3         i = start_index - 1
4         for j in range(start_index,end_index):
5             if list[j] > flag:
6                 pass
7             else:
8                 i += 1
9                 tmp = list
10                 list = list[j]
11                 list[j] = tmp
12         tmp = l[end_index]
13         l[end_index] = l[i+1]
14         l[i+1] = tmp
15
16         return i+1
17
18     def Quick_sort(list,start_index,end_index):
19         if start_index >= end_index:
20             return
21         middle = path_sort(list,start_index,end_index)
22         Quick_sort(list,start_index,middle-1)
23         Quick_sort(list,middle+1,end_index)
24         print(l)
25
26     Quick_sort(l,0,len(l)-1)
  ps,其实不难的,只要你肯认真思考。O(&cap;_&cap;)O~
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60716-1-1.html 上篇帖子: Python 开发环境搭建 下篇帖子: python获得当前目录下文件,并写到name.txt
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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