插入排序算法就地和循环变体

Insertion Sort Algorithm In place and loop variant

第 1 部分
我知道可以使用 QuickSort 'in place' 但有人可以向我解释插入排序算法如何使用 'in place'.

据我了解:

插入排序从第一个值开始并将其与下一个值进行比较,如果该值小于我们的值,则它们交换位置。我们递归地继续这个。 (简短说明)

所以你会说这是 'in place' 因为我们没有创建一个新数组来做这件事,而只是比较数组中的两个元素?

如果我的理解有误,谁能解释一下 插入排序算法就位。

第 2 部分
另外,我将如何使用插入排序来说明循环不变量的概念?

我知道循环不变量是在循环的每次迭代之前和之后立即为真的条件,但我不确定这与插入排序有何关系。

就像评论部分提到的 Thorsten 一样,您已经描述了冒泡排序。修改自Wikipedia,冒泡排序的伪代码如下:

procedure bubbleSort( A : list of sortable items )
   n = length(A)
   for i = 1 to n inclusive do // Outer Loop
     for j = 1 to n-1-i inclusive do
       /* if this pair is out of order */
       if A[j] > A[j+1] then
         swap(A[j], A[j+1])
       end if
     end for
   end for
end procedure

冒泡排序(对于外循环)中的循环不变量是,在循环的每次迭代之后,整个数组直到 i 的当前值将被排序。这是因为,每次到达外层循环时,都会在经过内层循环的所有迭代(从 i 到 n-1)之后,找到那里的最小元素并将该元素与第 i 个元素交换。

冒泡排序确实就位,因为所有排序都在原始数组本身内进行,不需要单独的外部数组。

编辑-现在进入插入排序:

伪代码如下(万岁Wikipedia):

 for i = 1 to length(A) - 1
    x = A[i]
    j = i
    while j > 0 and A[j-1] > x
        A[j] = A[j-1]
        j = j - 1
    end while
    A[j] = x[3]
 end for

在这里,在每个步骤中,对于每个元素,您 select 将其插入到数组中的适当位置,即,您将它插入到第一个较小的元素之后比它在数组中。更详细一点,内部循环所做的是,它不断向右移动元素,直到遇到比所考虑的元素更小的元素,此时您将元素插入到较小的元素之后。这意味着对上述元素之前的每个元素进行排序。外层循环确保对数组中的所有元素完成此操作,这意味着在外层循环完成时,数组已排序。

外层循环的循环不变量与之前一样,在第 i 次迭代后,所有元素直到当前 i 将被排序。然而,就在第 i 次交互之前,将对 i-1 之前的所有元素进行排序。

插入排序算法不需要外部数组进行排序。更具体地说,所有操作都是在数组本身上完成的(除了我们需要存储我们当前试图插入其适当位置的元素的一个变量),并且没有使用外部数组 - 没有从这个数组复制例如,另一个。因此,算法所需的 space 复杂度(当然不包括 space 数组本身占用的)将是 O(1),而不是依赖于数组的大小,并且就地排序,很像冒泡排序。