Algorithm 将冒泡排序更改为插入排序,并对迭代进行少量更改

Algorithm 将冒泡排序更改为插入排序,并对迭代进行少量更改,algorithm,pseudocode,bubble-sort,insertion-sort,Algorithm,Pseudocode,Bubble Sort,Insertion Sort,我相信以下伪代码适用于冒泡排序算法: L = [8, 6, 7, 1, 5, 9, 4, 3, 10, 2] // 10 items FOR I = 1 TO 9 FOR J = 1 TO 10 - I IF L[J] > L[J + 1] THEN TEMP = L[J] L[J] = L[J + 1] L[J + 1] = TEMP ENDIF ENDFOR J EN

我相信以下伪代码适用于冒泡排序算法:

L = [8, 6, 7, 1, 5, 9, 4, 3, 10, 2] // 10 items
FOR I = 1 TO 9
    FOR J = 1 TO 10 - I
        IF L[J] > L[J + 1] THEN
            TEMP = L[J]
            L[J] = L[J + 1]
            L[J + 1] = TEMP
        ENDIF
    ENDFOR J
ENDFOR I
OUTPUT L
如果我改变I和J的迭代模式,如下面的例子,我是否将算法转换为插入排序?我想是的,但我很惊讶它会如此简单,我看到的各种实现往往差异更大

L = [8, 6, 7, 1, 5, 9, 4, 3, 10, 2] // 10 items
FOR I = 1 TO 9
    FOR J = 9 TO I STEP -1
        IF L[J] > L[J + 1] THEN
            TEMP = L[J]
            L[J] = L[J + 1]
            L[J + 1] = TEMP
        ENDIF
    ENDFOR J
ENDFOR I
OUTPUT L

第二个算法是冒泡排序的另一个版本。它不会在每次传递时将最大值移向数组的末尾,而是将最小值移向数组的开头。在下图中,第一行是未排序的数组,随后的每一行是执行一次内部循环后数组的状态。气泡排序的两个特征值得注意:

  • 行左侧的项目处于其最终位置
  • 右边的项目也会被重新排列,但不一定是它们的最终位置。例如,在第三行上,2从数组的末端移动到了中间。在这一点上,算法找到了1。所以它把2抛在后面,开始移动1

    下图显示了插入排序的操作。同样,有两个特点值得注意:

  • 左侧的数组按排序顺序排列,但元素不在其最终位置
  • 右边的项目是完全没有动过的
  • 插入排序的一般概念是算法(概念上)将数组分为两部分:开头的排序部分和结尾的未排序部分。在每次执行内部循环时,它将获取未排序部分的第一个元素,并将其向左移动,直到它在数组的已排序部分中正确定位


    那么,为了获得插入排序,第一个版本的最小修改是什么呢?谢谢。现在我可以看到,我需要从外循环计数器迭代到内循环中数组的开头。