Python 数组合并排序计数和排序时间
我创建了一个程序,其中数字是为列表/数组随机生成的。在这个列表中,我需要计算排序列表所需的时间,以及排序所需的交换数量 下面是我的代码。代码解决列表时没有任何问题,但时间和交换计数器工作不正常,它只会给出类似于0,1,1,1,2,1,1,0,2,4的结果 我是否在开始时间和结束时间添加计数时出错Python 数组合并排序计数和排序时间,python,arrays,sorting,mergesort,Python,Arrays,Sorting,Mergesort,我创建了一个程序,其中数字是为列表/数组随机生成的。在这个列表中,我需要计算排序列表所需的时间,以及排序所需的交换数量 下面是我的代码。代码解决列表时没有任何问题,但时间和交换计数器工作不正常,它只会给出类似于0,1,1,1,2,1,1,0,2,4的结果 我是否在开始时间和结束时间添加计数时出错 import random import time #X-------------------------------------------------------------------------
import random
import time
#X--------------------------------------------------------------------------------------------------------------------------------------------------------------------
# Random Number Generator
def random_generator():
randomNumber = random.randint(0, 1000)
return randomNumber
#X--------------------------------------------------------------------------------------------------------------------------------------------------------------------
def arraygenerator():
arr = []
for draw in range(8):
randomNumber = random_generator()
arr.append(randomNumber)
print ("Unsorted Array is : ", arr)
return arr
#X--------------------------------------------------------------------------------------------------------------------------------------------------------------------
#Insertion Sort
def mergeSort(A):
b = 0
start = time.time() # Start Timmer
if len(A) > 1:
# Finding the mid of the array
mid = len(A)//2
# Dividing the array elements
L = A[:mid]
# into 2 halves
R = A[mid:]
# Sorting the first half
mergeSort(L)
# Sorting the second half
mergeSort(R)
i = j = k = 0
# Copy data to temp arrays L[] and R[]
while i < len(L) and j < len(R):
if L[i] < R[j]:
A[k] = L[i]
i += 1
else:
A[k] = R[j]
j += 1
k += 1
b = b+1
# Checking if any element was left
while i < len(L):
A[k] = L[i]
i += 1
k += 1
while j < len(R):
A[k] = R[j]
j += 1
k += 1
end = time.time() # End Timmer
printf(end, start, b)
def printf(end, start, b):
print(f"Runtime of the program is {end - start}")
print ("Total Number of Swaps : ", b)
A = arraygenerator()
mergeSort(A)
print ("Sorted array", A)
您编写它的方式是让计时器对每个mergeSort函数调用进行调用。如果您想要程序的真实运行时间,请在调用mergeSort之前启动计时器,并检查函数调用期间的时间。展开我的评论:由于您递归调用了
mergeSort
,因此需要使用另一个函数来包装它以测量开始和结束时间
然后,为了正确跟踪交换的数量,由于mergeSort
在适当的位置对数组进行了变异,您可以使用return
返回该调用(可能是内部递归的)mergeSort
进行的交换数量:
import random
import time
def _merge_sort(A):
swaps = 0
if len(A) > 1:
# Finding the mid of the array
mid = len(A) // 2
# Dividing the array elements
L = A[:mid]
# into 2 halves
R = A[mid:]
# Sorting the first half
swaps += _merge_sort(L)
# Sorting the second half
swaps += _merge_sort(R)
i = j = k = 0
# Copy data to temp arrays L[] and R[]
while i < len(L) and j < len(R):
if L[i] < R[j]:
A[k] = L[i]
i += 1
else:
A[k] = R[j]
j += 1
k += 1
swaps += 1
# Checking if any element was left
while i < len(L):
A[k] = L[i]
i += 1
k += 1
while j < len(R):
A[k] = R[j]
j += 1
k += 1
return swaps
def mergeSort(A):
start = time.time() # Start Timmer
swaps = _merge_sort(A)
end = time.time() # End Timmer
print(f"Runtime of the program is {end - start}")
print("Total Number of Swaps : ", swaps)
A = [random.randint(0, 1000) for x in range(8)]
print("Unsorted array", A)
mergeSort(A)
print("Sorted array", A)
随机导入
导入时间
定义合并排序(A):
互换=0
如果len(A)>1:
#查找数组的中间部分
mid=len(A)//2
#分割数组元素
L=A[:中间]
#分成两半
R=A[mid:]
#上半场的排序
交换+=\u合并\u排序(L)
#下半场的排序
交换+=\u合并\u排序(R)
i=j=k=0
#将数据复制到临时数组L[]和R[]
而i
您正在递归调用mergeSort
——每次递归调用都会计算自己的时间和交换次数。
import random
import time
def _merge_sort(A):
swaps = 0
if len(A) > 1:
# Finding the mid of the array
mid = len(A) // 2
# Dividing the array elements
L = A[:mid]
# into 2 halves
R = A[mid:]
# Sorting the first half
swaps += _merge_sort(L)
# Sorting the second half
swaps += _merge_sort(R)
i = j = k = 0
# Copy data to temp arrays L[] and R[]
while i < len(L) and j < len(R):
if L[i] < R[j]:
A[k] = L[i]
i += 1
else:
A[k] = R[j]
j += 1
k += 1
swaps += 1
# Checking if any element was left
while i < len(L):
A[k] = L[i]
i += 1
k += 1
while j < len(R):
A[k] = R[j]
j += 1
k += 1
return swaps
def mergeSort(A):
start = time.time() # Start Timmer
swaps = _merge_sort(A)
end = time.time() # End Timmer
print(f"Runtime of the program is {end - start}")
print("Total Number of Swaps : ", swaps)
A = [random.randint(0, 1000) for x in range(8)]
print("Unsorted array", A)
mergeSort(A)
print("Sorted array", A)