Python 写的快排问题
问题在于切片不是容器本身,切片后会形成新的容器,你对新容器里的排序结果没有带回,因此得不到正确结果。
■网友
这代码真让人抓狂,也不格式化一下,替你格式化过了。最近无聊想用函数式的方式实现快速排序,正好给你看看,你的代码有问题,修改如下:def partiton(li, a, b): x = li i = a for j in range(a,b): if li \u0026lt; x: li, li = li, li i += 1 li, li = li, li return idef quickSort(li, a, b): if a \u0026gt;= b: return i = partiton(li, a, b) quickSort(li, a, i - 1) quickSort(li, i + 1, b)li = quickSort(li, 0, len(li) - 1)print li1、quickSort(li) 时,li新建一个实例了,怎么还能对原来的数组排序?错!2、分区时,向前移动后交换,错!3、partiton 拼错了!嗯~这个不影响~BTW:你这代码需要好好规范下,看到一堆iiiiiiiiiii附两个非for/while循环的方式实现,临时写的,刚才写的时候也折腾了一会。实现1def swap(xs, a, b): tmp = xs xs = xs xs = xsdef partition(xs, a, b): def do_part(xs, a, k, m): if k \u0026gt;= m: swap(xs, a, m) return a if xs \u0026lt; xs: swap(xs, a, k) return do_part(xs, a + 1, k + 1, m) else: return do_part(xs, a, k + 1, m) swap(xs, b, (a + b) /2) return do_part(xs, 0, 0, b)def qsort3(xs): def do_sort(a, b): if a \u0026gt;= b: return pivot = partition(xs, a, b) do_sort(a, pivot - 1) do_sort(pivot + 1, b) do_sort(0, len(xs) - 1)实现2(好吧!这个初次接触Haskell时模仿到的,No Side Effects可以这么玩)def qsort(xs): if len(xs) \u0026lt;= 0: return return qsort( if x \u0026gt; xs]) + \\ ] + \\ qsort( if x \u0026lt;= xs])
■网友
分区的时候索引取的不对, 应该所分区的起始和结束索引, 你取的依然是原数组的索引
■网友
1.python的切片产生的是新的对象,对新对象的成员的操作不影响旧对象。2.partition那里交换没看懂贴一下我之前的练习吧。(之前是写Java的。。。)def quick_sort(lists,left,right): if left \u0026gt; right: return lists low,high = left,right key = lists #key即是标准数 while left \u0026lt; right: while left \u0026lt; right and lists \u0026gt;= key: right-=1 lists = lists while left \u0026lt; right and lists \u0026lt;= key: left+=1 lists = lists lists = key quick_sort(lists,low,left-1) quick_sort(lists,right+1,high) return lists快速排序运用了典型的分治、递归的思想实现排序。取数组第一个数作为一个标准,拿数组的值依次跟它比较,比它小的就放在它的左边,比它大的就放在它的右边,此时这个标准数在排序后的数组中的位置就确定了。左右两边的数组采取上述相同的办法即可。推荐使用Pycharm设置断点调试就知道错在哪里了。。。
■网友# -*- coding: utf-8 -*-import randomdef partition(lst, start, end): pivot, j = lst, start for i in range(start, end-1): if lst \u0026lt; pivot and i != j: lst, lst = lst, lst if lst \u0026lt;= pivot: # j points to a element which is greater than pivot j += 1 lst, lst = lst, lst return jdef qsort(lst, start, end): if end-start \u0026gt; 1: k = partition(lst, start, end) qsort(lst, start, k) qsort(lst, k+1, end)if __name__ == \u0026#39;__main__\u0026#39;: s = for _ in range(500): random.shuffle(s) qsort(s, 0, len(s)) for i in range(len(s)): assert s==i
推荐阅读
- 加热■手写的“时控标贴”靠谱吗? 饮品巨头寒冬争推热饮新品
- 怎样成为一名合格的Python程序员?
- python 爬虫,咋获得输入验证码之后的搜索结果
- python的html5lib这个库咋使用啊我在网上也没有找到相关文档
- 零基础入门学习啥语言好
- Python3.4和3.5区别大么
- python 中 def_():...... return _有啥作用
- 新互联网网站用Java还靠谱么对比Php,Python,Ruby的话
- 30岁男,创业失败转行学python,是否很晚?也不好找工作?
- Python 的开发速度比 C#.net 或 Vb.net 更快吗?
