Python 合并排序计数比较
问题是:1)计算比较的代码正确吗? 2) 如何返回带有排序列表的计数器,如([1,2,3,4],比较数)代码: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
答案是肯定的,这个代码可以计算比较的次数, 但是你必须清楚地知道你想要计算什么 这里有一些修改,如果不需要,可以删除它们
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)