我试图进行合并排序算法,但没有得到任何输出,似乎陷入了无限循环
我正在尝试返回按降序排序的数字列表,但只有偶数才是代码:
def leer_vector(lis,n):
for x in range(n):
lis.append(int(input("Ingrese el dato: ")))
return lis
cd = int(input("Ingrese la cantidad de datos: "))
v1 = []
v2 = []
v3 = []
leer_vector(v1,cd)
leer_vector(v2,cd)
v3 = v1 + v2
def merge_sort(arr):
if len(arr) > 1:
leftarr = arr[:len(arr)//2]
rightarr = arr[len(arr)//2:]
merge_sort(leftarr)
merge_sort(rightarr)
i = 0
j = 0
k = 0
while i < len(leftarr) and j < len(rightarr):
if leftarr[i] > rightarr[j] and leftarr[i] % 2 == 0:
arr[k] = leftarr[i]
i += 1
else:
if rightarr[j] % 2 == 0:
arr[k] = rightarr[j]
j += 1
k += 1
while i < len(leftarr):
if leftarr[i] % 2 == 0:
arr[k] = leftarr[i]
i += 1
k += 1
while j < len(rightarr):
if rightarr[j] % 2 == 0:
arr[k] = rightarr[j]
j += 1
k += 1
merge_sort(v3)
print(v3)
对整个列表进行排序然后删除奇数会更容易。像这样的东西:
from random import randint
# merge sort in situ
def mergeSort(lst):
if len(lst) > 1:
r = len(lst) // 2
left = lst[:r]
right = lst[r:]
mergeSort(left)
mergeSort(right)
i = j = k = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
lst[k] = left[i]
i += 1
else:
lst[k] = right[j]
j += 1
k += 1
if (m := len(left) - i) > 0:
lst[k:k+m] = left[i:i+m]
k += m
if (m := len(right) - j) > 0:
lst[k:k+m] = right[j:j+m]
k += m
# create a list of 50 pseudo-random numbers in the range 1 to 100
lst = [randint(1, 100) for _ in range(50)]
print(lst)
mergeSort(lst)
# reconstruct the list taking only even numbers
lst = [x for x in lst if x % 2 == 0]
print(lst)