首页 > 解决方案 > 在 Python 中使用新数组的插入算法

问题描述

我正在尝试实现排序算法,该算法采用元素并将其复制到 tonew array并以某种方式对它们进行排序。我知道,这是一种低效且过时的方法,但这里的目标是改善算法思维方式。我将粘贴所有代码,这有点广泛但没有留下任何空白。

该块,特别是要修复的块可能是以 . 开头的块while not check。我正在尝试最坏的情况(反转数组)。

所以每次索引j=0和它从头开始做交换。我希望它反之亦然(从头开始)。

def swap(container, i, j):
    if container[i] != container[j]:
        container[i], container[j] = container[j], container[i]


def old_sort(container):
    new_arr = [0 for i in range(0, 20)]
    new_arr[0] = container[0]
    j = 0
    for i in range(1, len(container)):
        
        if len(new_arr) == 1 and container[i] < new_arr[j]:
            container[j+1] = container[i]
            
        
        while container[i] < new_arr[j]:
            j -=1
        
        if j < 0:
            j +=1
                
        tmp = container[i]
        index = j
        check = False
        
        while not check and j < len(new_arr) and container[j] != 0:
                new_arr[j+1] = new_arr[j]
                j +=1
                check = True
        
        check = False
            
        new_arr[index] = tmp
    
    return new_arr

container = [i for i in range(10, -1, -1)]
sorted_arr = old_sort(container)
print(sorted_arr)

更新:

我已经在不使用第二个索引的情况下查明了问题。正如我正在设置的那样tmp=container[i],我必须将它与之前的元素容器 [i-1] 进行比较,然后进行交换,最后设置tmp到正确的位置。

def old_sort(container):
    new_arr = [0 for i in range(0, 11)]
    new_arr[0] = container[0]
    

    for i in range(1, len(container)):
        tmp = container[i]
        
        while tmp < new_arr[i - 1] and i > 0:
            new_arr[i] = new_arr[i-1]
            i -=1
        
        if i < 0:
            i +=1
        new_arr[i] = tmp
    
    return new_arr

tests = [
        [11,9,29,7,2,15,28],
        [3, 7, 9, 11],
        [25, 22, 21, 10],
        [29, 15, 28],
        [6]
    ]

for elements in tests:
    new_arr = old_sort(elements)
    print(new_arr)

输出:

[2, 7, 9, 11, 15, 28, 29, 0, 0, 0, 0]
[3, 7, 9, 11, 0, 0, 0, 0, 0, 0, 0]
[10, 21, 22, 25, 0, 0, 0, 0, 0, 0, 0]  
[15, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0]   
[6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

标签: pythonsorting

解决方案


您可以从 j 作为最后一项进行迭代,直到 0。我不确定您是否想要更改用于 new_arr 的索引,也许您想要 j-1。

j = len(new_arr) - 1
while not check and j >= 0 and container[j] != 0:
    new_arr[j + 1] = new_arr[j]
    j -= 1
    check = True

推荐阅读