我知道插入排序是什么,但我不明白代码。我搜索了它是关于排序但不是代码的所有解释。如果您通过示例逐步回答问题,对我来说会更容易!谢谢! 以此代码为例。我把我的问题放在评论中以使其更清楚。
void insertionSort(int arr[], int n)
{
int i, key, j;
for (i = 1; i < n; i++)
{
key = arr[i];
j = i-1;
while (j >= 0 && arr[j] > key)
{
arr[j+1] = arr[j];
/* if arr[j] > key, at here arr[j+1] has the number in arr[j] which is i
* or key right? But now only arr[j+1] changed. There are only two same
* numbers which is the bigger number, arr[j] is not changed to the smaller
* number which arr[j+1] was.
*/
j = j-1;
}
arr[j+1] = key;
/* so at here arr[j+1] now has the value of key which is arr[i], so the
* sorted arr[j+1] ended up unchanged? I know this step is supposed to
* change key to use it to compare numbers after.
*/
}
}
答案 0 :(得分:3)
你正在调用的关键是一个临时变量,它存储了第i个元素的值我上传的图片可能会帮助你更好地理解它
看到你用1初始化了变量i所以key = arr [i] = arr 1 = 4换句话说,key现在是4.And j = i-1也是0.所以移动在(j&gt; = 0&amp;&amp; arr [j]&gt; key)时,这将检查j是否为正,然后检查该值是否存储在数组中的第j个位置(在这种情况下是arr [ 0] = 7)大于键值然后循环启动并且现在在循环体内arr [j + 1] = arr [j]在此语句中arr [j + 1]的元素是arr {{3赋值为arr [0]的值为7.此后移动到下一个语句j然后减1,因此j现在为-1。由于第一个条件现在为假,因此while循环将会中断。现在移出循环,我们看到arr [j + 1]将为arr [0]现在分配“key”值为4.类似每次如果有一个条件,其中前一个元素的值(其位置)由i)确定的大于当前元素的值(其位置由j确定)在数组中被交换。如果循环的条件(arr [j]&gt;键)未满足,则语句arr [j + 1] = key将意味着什么,因为j + 1将等于i。并且价值不会改变。
答案 1 :(得分:0)
你的问题有点不清楚,所以让我试着解释代码中发生的事情,然后再尝试回答它们
i
表示数组中未排序数据的开头。它将从1
增加到n
到for loop
key
表示未排序区域中的第一个元素,我们试图在while loop
完成后将其置于正确的位置j
表示已排序区域中的最后一个索引。它将通过while loop
基本思想是在未排序部分中插入下一个元素,方法是将所需元素从排序部分右移直到这个新元素的最终位置
现在回答你的问题
如果arr [j]&gt; key,在这里arr [j + 1]的数字在arr [j]
YES
是我还是关键?
NO。 arr[j+1] == key
,仅在while的第一次迭代期间,而不是在
但现在只有arr [j + 1]改变了。
是和否。在循环的一次迭代中,只有arr[j+1]
发生了变化,但在j = j -1
的下一次迭代中,前一个元素发生了变化,或者更确切地说is shifted right
只有两个相同的数字是更大的数字, arr [j]未更改为arr [j + 1]所用的较小数字。
在给定的迭代中arr[j]
不会改变,但这并不意味着arr[j]
在下一次迭代中不会改变。例如,假设j = 10
是当前的迭代。因此a[10]
在while循环的迭代中不会发生变化,但在j = 9
和a[10] = a[9]
所以在这里arr [j + 1]现在有了key的值,这是arr [i]
不,arr[i]
可能会被while循环的第一次迭代覆盖,因此会在key
中备份
所以排序的arr [j + 1]最终没变?我知道这一步应该改变密钥,用它来比较之后的数字。
根据上述答案,这是无效的