Quantcast
Channel: CodeSection,代码区,Python开发技术文章_教程 - CodeSec
Viewing all articles
Browse latest Browse all 9596

Select Sort

$
0
0
select sort

闲着没事,就想起写写排序的算法,因为从来没用python写过算法,依据算法的原理很快 就撸了个选择排序:

def select_sort(ary): for i in range(len(ary)): tmp = ary[i] index = ary.index(min(ary[i:])) ary[i] = ary[index] ary[index] = tmp return ary

咋一看没有问题,然后测试的结果让我吃了一惊,很小的测试集合。

test = [23, 455, 234, 23423, 23, 4, 5, 6, 7, 3] 结果是: result = [3, 4, 5, 6, 7, 234, 23423, 455, 23, 23]

基于对数据研究后的一个猜测是因为重复的值存在造成的。 于是将重复值去除结果就对了。于是开始debug,结果让我哭笑不得。 index的一个特性是返回第一个符合传入参数的元素的index。 而我在这句:

index = ary.index(min(ary[i:]))

中ary.index就成了全list索引而不是扣除已经排好序的剩余list元素中比较。

改成index = i + ary[i:].index(min(ary[i:])) def select_sort(ary): for i in range(len(ary)): tmp = ary[i] index = i + ary[i:].index(min(ary[i:])) ary[i] = ary[index] ary[index] = tmp return ary 就OK了,这其中还有个坑是如果漏了i,那么左值index仅仅是子序列ary[i:]的index, 而不是整个ary的index,这样必然会给等下的swap造成问题的。

这事给我的一个教训是,使用对象的方法一定要注意特性。


Viewing all articles
Browse latest Browse all 9596

Trending Articles