Python 合并排序计数比较

Python 合并排序计数比较,python,Python,问题是:1)计算比较的代码正确吗? 2) 如何返回带有排序列表的计数器,如([1,2,3,4],比较数)代码: 答案是肯定的,这个代码可以计算比较的次数, 但是你必须清楚地知道你想要计算什么 这里有一些修改,如果不需要,可以删除它们 counter = 0 def merge_sort(lst): global counter if len(lst) <= 1: counter += 1 # increment counter when we divid

问题是:1)计算比较的代码正确吗? 2) 如何返回带有排序列表的计数器,如([1,2,3,4],比较数)代码:


答案是肯定的,这个代码可以计算比较的次数, 但是你必须清楚地知道你想要计算什么

这里有一些修改,如果不需要,可以删除它们

counter = 0


def merge_sort(lst):
    global counter
    if len(lst) <= 1:
        counter += 1 # increment counter when we dividing array on two
        return lst
    mid = len(lst) // 2
    left = merge_sort(lst[:mid])
    right = merge_sort(lst[mid:])
    return merge(left, right)


def merge(left, right):
    global counter
    if not left:
        counter += 1 # increment counter when not left (not left - is also comparison)
        return right
    if not right:
        counter += 1 # the same as above for right
        return left
    if left[0] < right[0]:
        counter += 1 # and the final one increment
        return [left[0]] + merge(left[1:], right)
    return [right[0]] + merge(left, right[1:])


lst = [4, 5, 1, 6, 3]
# also you don't need to return counter since you are using global value
print(merge_sort(lst), counter)
计数器=0
def合并_排序(lst):
全局计数器

如果len(lst)答案是肯定的,则此代码可计算比较次数, 但是你必须清楚地知道你想要计算什么

这里有一些修改,如果不需要,可以删除它们

counter = 0


def merge_sort(lst):
    global counter
    if len(lst) <= 1:
        counter += 1 # increment counter when we dividing array on two
        return lst
    mid = len(lst) // 2
    left = merge_sort(lst[:mid])
    right = merge_sort(lst[mid:])
    return merge(left, right)


def merge(left, right):
    global counter
    if not left:
        counter += 1 # increment counter when not left (not left - is also comparison)
        return right
    if not right:
        counter += 1 # the same as above for right
        return left
    if left[0] < right[0]:
        counter += 1 # and the final one increment
        return [left[0]] + merge(left[1:], right)
    return [right[0]] + merge(left, right[1:])


lst = [4, 5, 1, 6, 3]
# also you don't need to return counter since you are using global value
print(merge_sort(lst), counter)
计数器=0
def合并_排序(lst):
全局计数器

如果len(lst)我找到了这样的解决方案:

def merge_sort(input_array):
counter = 0

if len(input_array) <= 1:
    return input_array, counter

left_part = merge_sort(input_array[:len(input_array) // 2])
right_part = merge_sort(input_array[len(left_part[0]):])

counter += left_part[1] + right_part[1]

left_ndx = 0
right_ndx = 0
final_ndx = 0

while left_ndx < len(left_part[0]) and right_ndx < len(right_part[0]):
    counter += 1
    if left_part[0][left_ndx] < right_part[0][right_ndx]:
        input_array[final_ndx] = left_part[0][left_ndx]
        left_ndx += 1
    else:
        input_array[final_ndx] = right_part[0][right_ndx]
        right_ndx += 1
    final_ndx += 1

while left_ndx < len(left_part[0]):
    input_array[final_ndx] = left_part[0][left_ndx]
    left_ndx += 1
    final_ndx += 1
    counter += 1

while right_ndx < len(right_part[0]):
    input_array[final_ndx] = right_part[0][right_ndx]
    right_ndx += 1
    final_ndx += 1
    counter += 1

return input_array, counter

我通过这种方式找到了一个解决方案:

def merge_sort(input_array):
counter = 0

if len(input_array) <= 1:
    return input_array, counter

left_part = merge_sort(input_array[:len(input_array) // 2])
right_part = merge_sort(input_array[len(left_part[0]):])

counter += left_part[1] + right_part[1]

left_ndx = 0
right_ndx = 0
final_ndx = 0

while left_ndx < len(left_part[0]) and right_ndx < len(right_part[0]):
    counter += 1
    if left_part[0][left_ndx] < right_part[0][right_ndx]:
        input_array[final_ndx] = left_part[0][left_ndx]
        left_ndx += 1
    else:
        input_array[final_ndx] = right_part[0][right_ndx]
        right_ndx += 1
    final_ndx += 1

while left_ndx < len(left_part[0]):
    input_array[final_ndx] = left_part[0][left_ndx]
    left_ndx += 1
    final_ndx += 1
    counter += 1

while right_ndx < len(right_part[0]):
    input_array[final_ndx] = right_part[0][right_ndx]
    right_ndx += 1
    final_ndx += 1
    counter += 1

return input_array, counter

如果你在计算比较,那么在每个条件之后不应该有一个
计数器+=1
吗?如果你在计算比较,那么在每个条件之后不应该有一个
计数器+=1
吗?非常感谢!它起作用了。但是我仍然需要修改这个代码,所以我的最终输出应该是
([1,3,4,5,6],counter)
。我不知道该怎么做。当我试图在函数内部执行时,递归每次都会将我的计数器重置为0。你能在你的问题中添加示例吗?我发布了答案。另外,如果您有可能帮助我计算快速排序方法中的比较次数。代码是下一个:只需检查这里的代码,并根据需要修改它:非常感谢!它起作用了。但是我仍然需要修改这个代码,所以我的最终输出应该是
([1,3,4,5,6],counter)
。我不知道该怎么做。当我试图在函数内部执行时,递归每次都会将我的计数器重置为0。你能在你的问题中添加示例吗?我发布了答案。另外,如果您有可能帮助我计算快速排序方法中的比较次数。代码是下一个:只需在此处检查代码,并根据需要进行修改:
([1,3,4,5,6], counter)