如何理解插入排序中更改键值?

时间:2016-10-28 16:59:18

标签: c algorithm sorting insertion-sort insertion

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

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

2 个答案:

答案 0 :(得分:3)

你正在调用的关键是一个临时变量,它存储了第i个元素的值我上传的图片可能会帮助你更好地理解它

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

看到你用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增加到nfor loop
  • key表示未排序区域中的第一个元素,我们试图在while loop完成后将其置于正确的位置
  • j表示已排序区域中的最后一个索引。它将通过while loop
  • 递减到0

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

现在回答你的问题

  

如果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 = 9a[10] = a[9]

的下一次迭代中它可能会发生变化
  

所以在这里arr [j + 1]现在有了key的值,这是arr [i]

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

  

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

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