【发布时间】:2016-05-01 22:28:55
【问题描述】:
我是算法的新手,我很困惑我作为作业编写的代码中的错误在哪里。我正在尝试在 Python 3 中实现一个快速排序算法,该算法处理数组中的相等值。
这是一个快速排序函数(a 代表数组):
def randomized_quick_sort(a, l, r):
if l >= r:
return
k = random.randint(l, r)
a[l], a[k] = a[k], a[l]
m1, m2 = partition3(a, l, r)
randomized_quick_sort(a, l, m1 - 1);
randomized_quick_sort(a, m2 + 1, r);
这是我的分区函数:
def partition3(a, l, r):
x, j, t = a[l], l, r
for i in range(l + 1, r + 1):
if a[i] < x:
j +=1
a[i], a[j] = a[j], a[i]
elif a[i] > x:
a[i], a[t] = a[t], a[i]
t -=1
else:
j +=1
a[l], a[j] = a[j], a[l]
return j, t
【问题讨论】:
-
我建议将标题中的“3-way”替换为“stable”,或者将其完全删除。从根本上说,所有种类都更少,相等,更大。一些排序算法在元素相等时保持元素顺序,称为“稳定”排序实现。 3-way 让我想到 3-way 区分或排序 3 个单独的列表,比将 3 个列表连接成一个列表并对其进行排序更有效。
-
@IceArdor:我很确定 Elen 指的是 3 路 partitioning(“Dutch national flag problem”)。来自维基百科:“特别是,quicksort 算法的变体必须对重复元素具有鲁棒性,需要一个三向分区函数,该函数将小于给定键(红色)、等于键(白色)和大于钥匙(蓝色)。”