【发布时间】:2014-05-02 06:32:01
【问题描述】:
我是python新手。
最近我在 python 中实现快速排序。
我听说名为 list 的变量类型是可变的,因此对此所做的任何更改都会生效。但是,它不在我的位置。
这是我的例子,名为 alpartition 的函数已经过测试,向我证明这个函数可以工作。(在快速排序算法中是必需的)。而名为 test 的函数是一个递归函数。从打印结果中我们可以看到,名为 a 的变量的所有各方都已被修改。但它只是不一起进来。在我看来,对这个变量进行了一次更改。
我以前是一个 C 程序员,我有点把列表当作指针的集合,我猜错误是由于滥用了切片技术。
非常感谢您的热心帮助。
这里是函数:
__author__ = 'tk'
import random
def alpartition(my_str):
signal = 0
i = 0
j = len(my_str)
while i < j:
if signal == 0 :
while 1:
j = j - 1
if my_str[j] <= my_str[i]:
break
signal = 1
else:
while 1:
i = i + 1
if my_str[j] <= my_str[i]:
break
signal = 0
my_str[j],my_str[i] = my_str[i],my_str[j]
my_str[j],my_str[i] = my_str[i],my_str[j]
return i
def test(my_str):
if len(my_str)>1:
tick = alpartition(my_str)
print my_str,my_str[0:tick:],my_str[tick+1::],tick #We can see that my_str has correctly been modified
if tick > 0 :
test(my_str[0:tick:])
test(my_str[tick+1::])
a= [86, 44, 31, 7, 9, 90, 93, 12, 59, 34]
test(a)
print a
结果如下: 要打印的first变量是分区变量,它由名为tick的变量分区,其值将打印在第四位置. 第二个和第三个变量只是部分变量。
[34, 44, 31, 7, 9, 59, 12, 86, 93, 90] [34, 44, 31, 7, 9, 59, 12] [93, 90] 7
[12, 9, 31, 7, 34, 59, 44] [12, 9, 31, 7] [59, 44] 4
[7, 9, 12, 31] [7, 9] [31] 2
[7, 9] [] [9] 0
[44, 59] [44] [] 1
[90, 93] [90] [] 1
[34, 44, 31, 7, 9, 59, 12, 86, 93, 90]
我的问题是为什么最终结果与一开始打印的第一个变量相同。为什么没有对该变量进行所有更改?
【问题讨论】:
-
第一件事:你真的需要实现快速排序吗?真正的问题。有时新人会重新发明轮子。
-
是的,这是我的作业,我今年正在学习算法课程。但是老师给我的代码都是伪代码。而且我正在一一做,大家可以看我的blog
标签: python list pointers reference quicksort