归并排序算法不起作用(python)

问题描述 投票:0回答:1

我试图进行合并排序算法,但没有得到任何输出,似乎陷入了无限循环

我正在尝试返回按降序排序的数字列表,但只有偶数才是代码:

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)
python list sorting mergesort
1个回答
0
投票

对整个列表进行排序然后删除奇数会更容易。像这样的东西:

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)
© www.soinside.com 2019 - 2024. All rights reserved.