两个问题。
我尝试过的
def generate_worst_case_shell_sort(n, gaps):
# Start with a sorted array
array = list(range(1, n + 1))
for gap in reversed(gaps):
# Process groups defined by the gap
for i in range(gap):
group = array[i::gap]
# Reverse sort each group
group.sort(reverse=True)
array[i::gap] = group
return array
# Example usage
n = 100
gaps = [1, 4, 13, 40]
worst_case_array = generate_worst_case_shell_sort(n, gaps)
print(worst_case_array)
算法
这是一种可能的实现方式。
def shell_sort(A):
N = len(A)
h = 1
while h < N // 3:
h = h * 3 + 1
while h >= 1:
for i in range(h, N):
for j in range(i, h-1, -h):
if less(A[j], A[j - h]):
exch(A, j, j - h)
h //= 3
背景
Rene Argento 建议 作者暗示采用随机生成的随机方法。 2.1.19 问题来自 Robert Sedgewick 和 Kevin Wayne 的算法(第 4 版)。
相关
我不明白你如何确定 n = 10 时 shellsort 的最坏情况 37。我的意思是你使用了哪组间隙,它们是 n = 10 时的最佳组吗?
我发现 n = 10 的最佳间隙集会产生 35 次比较的最坏情况 - 这就是我问的原因。
但也许最初的问题并不关心最好的间隙集合,也许任何集合都可以使用?