第 3 遍结束时的排序算法输出

Sorting Algorithm output at end of pass 3

给定以下最初未排序的列表:

[77, 101, 40, 43, 81, 129, 85, 144]

哪种排序算法在第 3 遍末尾生成以下列表?是气泡、插入还是选择?

[40, 43, 77, 81, 85, 101, 129, 144]

谁能告诉我如何解决这个问题。

插入排序会在 3 遍中更改最多 3 个项目的相对顺序,导致前 3 个项目按顺序排列,其余项目不变。选择排序只会影响前 3 个项目和 3 个最小(或最大)项目的位置。只有冒泡排序会交换其他项目。 40 和 129 的移动是指向冒泡排序的明显标志。

请注意,这可能是一个棘手的问题,因为所有需要移动的数字最多相差 2 个位置,除了其中 2 个(101 和 129,它们是第二大和第三大的,将结束2 次传球后回到正确的位置)。正确实施的冒泡排序不会进入第三遍。所以答案可能是“none of them”

插入排序:

def insertion_sort(array):
    for i in range(1, len(array)):
        key_item = array[i]
        j = i - 1
        while j >= 0 and array[j] > key_item:
            array[j + 1] = array[j]
            j -= 1
        array[j + 1] = key_item
        print("Step",i,":",array)
    return array

data=[77, 101, 40, 43, 81, 129, 85, 144]
insertion_sort(data)

输出:

Step 1 : [77, 101, 40, 43, 81, 129, 85, 144]
Step 2 : [40, 77, 101, 43, 81, 129, 85, 144]
Step 3 : [40, 43, 77, 101, 81, 129, 85, 144]
Step 4 : [40, 43, 77, 81, 101, 129, 85, 144]
Step 5 : [40, 43, 77, 81, 101, 129, 85, 144]
Step 6 : [40, 43, 77, 81, 85, 101, 129, 144]
Step 7 : [40, 43, 77, 81, 85, 101, 129, 144]

冒泡排序:

def bubble_sort(array):
    n = len(array)
    for i in range(n):
        already_sorted = True
        for j in range(n - i - 1):
            if array[j] > array[j + 1]:
                array[j], array[j + 1] = array[j + 1], array[j]
                already_sorted = False
        if already_sorted:
            break
        print("Step:",n-j-1)
        print(array)
    return array

data = [77, 101, 40, 43, 81, 129, 85, 144]
bubble_sort(data)

输出:

Step: 1
[77, 40, 43, 81, 101, 85, 129, 144]
Step: 2
[40, 43, 77, 81, 85, 101, 129, 144]

选择排序:

def selectionSort(array, size):
    for step in range(size):
        min_idx = step

        for i in range(step + 1, size):
            if array[i] < array[min_idx]:
                min_idx = i
        (array[step], array[min_idx]) = (array[min_idx], array[step])
        print("step",step+1,":",end="")

        print(array)

data = [77, 101, 40, 43, 81, 129, 85, 144]
size = len(data)
selectionSort(data, size)

输出:

step 1 :[40, 101, 77, 43, 81, 129, 85, 144]
step 2 :[40, 43, 77, 101, 81, 129, 85, 144]
step 3 :[40, 43, 77, 101, 81, 129, 85, 144]
step 4 :[40, 43, 77, 81, 101, 129, 85, 144]
step 5 :[40, 43, 77, 81, 85, 129, 101, 144]
step 6 :[40, 43, 77, 81, 85, 101, 129, 144]
step 7 :[40, 43, 77, 81, 85, 101, 129, 144]
step 8 :[40, 43, 77, 81, 85, 101, 129, 144]

您还可以从下面的 link 如何 运行 算法中获得更多指南: https://realpython.com/sorting-algorithms-python/