【问题标题】:How to understand changing key value in insertion sort?如何理解插入排序中键值的变化?
【发布时间】:2017-03-11 15:02:36
【问题描述】:

我知道什么是插入排序,但我不懂代码。我搜索了所有关于排序的解释,而不是代码。如果您通过示例逐步回答问题,对我来说会更容易!谢谢! 例如,使用此代码。我将我的问题放在评论中以使其更清楚。

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.
  */
   }
}

【问题讨论】:

  • 你可以很容易地用谷歌搜索这个

标签: c algorithm sorting insertion-sort insertion


【解决方案1】:

你的问题有点不清楚,所以让我在尝试回答之前先解释一下代码中发生了什么

  • 外部循环变量i,表示数组中未排序数据的开始。它将从1 增加到n 通过for loop
  • key 表示未排序区域的第一个元素,我们试图在 while loop 完成后将其放入正确的位置
  • j 表示已排序区域中的最后一个索引。它将通过while loop 减为0

基本思想是在未排序部分中插入下一个元素,方法是将所需元素从已排序部分右移到这个新元素的最终位置

现在回答你的问题

如果 arr[j] > 键,这里 arr[j+1] 有 arr[j] 中的数字

是的

哪个是 i 或 key 对吗?

没有。 arr[j+1] == key,仅在第一次迭代期间,而不是在那之后

但现在只有 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 = 9a[10] = a[9]时它可能会在下一次迭代中改变

所以在这里 arr[j+1] 现在的键值为 arr[i]

不,arr[i] 可能会被 while 循环的第一次迭代覆盖,因此已在 key 中备份

所以排序后的 arr[j+1] 最终没有改变?我知道这一步应该更改密钥以在之后使用它来比较数字。

根据上述答案,这是无效的

【讨论】:

    【解决方案2】:

    你所说的key是一个临时变量,存储第i个元素的值我正在上传一张图片,可能会帮助你更好地理解它

    考虑一个数组 A[]={7,4,5,2}

    看到你已经用 1 初始化了变量 i,所以 key = arr[i]=arr1=4 换句话说 key 现在是 4。还有 j=i-1 这将是 0。所以继续下一条语句 while(j>=0 &&arr[j]>key) 首先检查 j 是否为正,然后检查存储在数组中第 j 个位置的值(在本例中为 arr[0]=7)是否更大比键值,然后循环启动,现在在循环体内 arr[j+1]=arr[j] 在此语句中, arr[j+1] 的元素 arr1 被分配了 arr[ 0] 是 7。在移动到下一个语句之后,j 减 1,所以 j 现在是 -1。由于第一个条件现在为假,因此 while 循环将中断。现在移出循环,我们看到 arr [j+1] 将是 arr[0] 现在被分配了“键”值,即 4。类似地,每次如果存在前一个元素的值(其位置由 i 确定)大于交换数组中当前元素(其位置由 j 确定)的值。如果循环的条件(arr[j] > key)不满足,那么语句 arr[j+1]=key 将毫无意义,因为 j+1 将等于 i。并且值不会改变。

    【讨论】:

    • 我知道插入排序是如何工作的。但不是在代码中。你能告诉我我上传的代码中的哪些步骤使 7 和 4 改变了位置?
    • 我在答案中添加了简要说明
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2013-03-28
    • 1970-01-01
    相关资源
    最近更新 更多