Python 快速排序只排序前半部分
Python quicksort only sorting first half
我正在学习普林斯顿的分而治之算法课程 - 第 3 周,并尝试实现快速排序。
这是我当前的实施,其中一些测试已准备就绪 运行:
import unittest
def quicksort(x):
if len(x) <= 1:
return x
pivot = x[0]
xLeft, xRight = partition(x)
print(xLeft, xRight)
quicksort(xLeft)
quicksort(xRight)
return x
def partition(x):
j = 0
print('partition', x)
for i in range(0, len(x)):
if x[i] < x[0]:
n = x[j + 1]
x[j + 1] = x[i]
x[i] = n
j += 1
p = x[0]
x[0] = x[j]
x[j] = p
return x[:j + 1], x[j + 1:]
class Test(unittest.TestCase):
def test_partition_pivot_first(self):
arrays = [
[3, 1, 2, 5],
[3, 8, 2, 5, 1, 4, 7, 6],
[10, 100, 3, 4, 2, 101]
]
expected = [
[[2, 1, 3], [5]],
[[1, 2, 3], [5, 8, 4, 7, 6]],
[[2, 3, 4, 10], [100, 101]]
]
for i in range(0, len(arrays)):
xLeft, xRight = partition(arrays[i])
self.assertEqual(xLeft, expected[i][0])
self.assertEqual(xRight, expected[i][1])
def test_quicksort(self):
arrays = [
[1, 2, 3, 4, 5, 6],
[3, 5, 6, 10, 2, 4]
]
expected = [
[1, 2, 3, 4, 5, 6],
[1, 2, 3, 4, 6, 10]
]
for i in range(0, len(arrays)):
arr = arrays[i]
quicksort(arr)
self.assertEqual(arr, expected[i])
if __name__ == "__main__":
unittest.main()
所以对于 array = [3, 5, 6, 10, 2, 4]
我得到 [2, 3, 6, 10, 5, 4]
结果...我不知道我的代码有什么问题。它分区很好,但结果不对...
有人可以参与吗? :) 谢谢!
这实际上是一个小问题,你会笑的
问题在于快速排序功能
正确的是:
def quicksort(x):
if len(x) <= 1:
return x
pivot = x[0]
xLeft, xRight = partition(x)
print(xLeft, xRight)
quicksort(xLeft)
quicksort(xRight)
x=xLeft+xRight #this one!
return x
发生的事情是 python 从这些 xleft 和 xright 创建了一个新对象,它们从来都不是就地排序
所以这是一个解决方案(还没有到位)
另一种是传递列表,start_index,end_index
就地做
干得好,伙计!
编辑:
实际上,如果您打印 xleft 和 xright,您会发现它的表现非常完美:)
我正在学习普林斯顿的分而治之算法课程 - 第 3 周,并尝试实现快速排序。
这是我当前的实施,其中一些测试已准备就绪 运行:
import unittest
def quicksort(x):
if len(x) <= 1:
return x
pivot = x[0]
xLeft, xRight = partition(x)
print(xLeft, xRight)
quicksort(xLeft)
quicksort(xRight)
return x
def partition(x):
j = 0
print('partition', x)
for i in range(0, len(x)):
if x[i] < x[0]:
n = x[j + 1]
x[j + 1] = x[i]
x[i] = n
j += 1
p = x[0]
x[0] = x[j]
x[j] = p
return x[:j + 1], x[j + 1:]
class Test(unittest.TestCase):
def test_partition_pivot_first(self):
arrays = [
[3, 1, 2, 5],
[3, 8, 2, 5, 1, 4, 7, 6],
[10, 100, 3, 4, 2, 101]
]
expected = [
[[2, 1, 3], [5]],
[[1, 2, 3], [5, 8, 4, 7, 6]],
[[2, 3, 4, 10], [100, 101]]
]
for i in range(0, len(arrays)):
xLeft, xRight = partition(arrays[i])
self.assertEqual(xLeft, expected[i][0])
self.assertEqual(xRight, expected[i][1])
def test_quicksort(self):
arrays = [
[1, 2, 3, 4, 5, 6],
[3, 5, 6, 10, 2, 4]
]
expected = [
[1, 2, 3, 4, 5, 6],
[1, 2, 3, 4, 6, 10]
]
for i in range(0, len(arrays)):
arr = arrays[i]
quicksort(arr)
self.assertEqual(arr, expected[i])
if __name__ == "__main__":
unittest.main()
所以对于 array = [3, 5, 6, 10, 2, 4]
我得到 [2, 3, 6, 10, 5, 4]
结果...我不知道我的代码有什么问题。它分区很好,但结果不对...
有人可以参与吗? :) 谢谢!
这实际上是一个小问题,你会笑的 问题在于快速排序功能 正确的是:
def quicksort(x):
if len(x) <= 1:
return x
pivot = x[0]
xLeft, xRight = partition(x)
print(xLeft, xRight)
quicksort(xLeft)
quicksort(xRight)
x=xLeft+xRight #this one!
return x
发生的事情是 python 从这些 xleft 和 xright 创建了一个新对象,它们从来都不是就地排序
所以这是一个解决方案(还没有到位) 另一种是传递列表,start_index,end_index 就地做
干得好,伙计! 编辑: 实际上,如果您打印 xleft 和 xright,您会发现它的表现非常完美:)