我目前正在阅读Cormen和co。的算法简介。我在为它推断伪代码时遇到了一些麻烦。我理解算法直观地做了什么,以及如何在整数数组中对某些元素进行排序。 例如 array = [5] [2] [4] [6] [1] [3] ,键是 j = 2 , i = J-1 即可。然后检查 i> 0 和 [5] 然后与 [5] 交换 [2] 。这里有令人困惑的部分: i = i -1 ??我的意思是我们只是设置 i = j-1 ,为什么我们再次递减 i ?
以下是伪代码:
for j = 2 to A.length
key = A[j]
i = j - 1
while i > 0 and A[i] > key
A[i + 1] = A[i]
i = i - 1 //this the part I do not understand.
A[i + 1] = key
答案 0 :(得分:1)
数组元素1..(j-1)
已经排序,您尝试将元素a[j]
插入到已排序的元素中。这是通过while循环完成的。从元素a[j-1]
开始,将新元素a[j]
逐个与已排序的元素进行比较,直到找到正确的插入位置。只要a[i]
更大,a[j]
必须在该元素之前移动,因此我们将a[i]
向上移动一个位置并减少i
以便进入下一个元素进行比较
要了解算法,我建议您使用一个小例子进行桌面检查。按照所有步骤查看其行为。
答案 1 :(得分:1)
此处列出的插入内容如下:
在每个j处,索引j之前的数组部分被排序,而索引j之后没有排序。
因此插入排序为新的A [j]找到合适的位置并将其插入那里。
例如,如果数组是
,则在j = 4
和i = 3
2 4 5 3 1 0
^
The array before element 3 is sorted.
1. So it checks that 3 is less than 5, hence copies 5 to array[i+1] (i+1 = 4).
2 4 5 5 1 0
2. Then it decrements i checks that 3 is less than 4, hence copies 4 to array[i+1] (i+1 = 3).
2 4 4 5 1 0
3. Then it checks that 3 is more than 2, hence stops and makes A[i+1] = key.
2 3 4 5 1 0