实现插入排序时的答案差异

Difference in answers while implementing insertion sort

我尝试使用 while 和 for 循环在 C 中实现插入排序,如下所示:

#include <stdlib.h>

int main()
{
    int a[]={4,7,8,2,16,21,12,3,1};
    int n=sizeof(a)/sizeof(a[0]);
    int j,k,i,x;
    /*for(j=0;j<n;j++)
    {
         k=a[j];
        for(i=j-1;i>=0 && k<a[i];i--)
                a[i+1]=a[i];
        a[i+1]=k;
    }*/
    for(i=1;i<n;i++)
    {
        k=a[i];
        j=i-1;
        while(j>=0 && a[j]>k)
        {
            a[j+1]=a[j];
            j=j-1;
        }
        a[j+1]=k;
    }
    printf("The elements of the array are: ");
    for(x=0;x<n;x++)
        printf("%d ", a[x]);
    return 0;
}

它工作得很好。但是,当我尝试删除变量 'k' 的使用时。答案打印如下:

我后面的代码如下:

#include <stdlib.h>

int main()
{
    int a[]={4,7,8,2,16,21,12,3,1};
    int n=sizeof(a)/sizeof(a[0]);
    int j,k,i,x;
    /*for(j=0;j<n;j++)
    {
         k=a[j];
        for(i=j-1;i>=0 && k<a[i];i--)
                a[i+1]=a[i];
        a[i+1]=k;
    }*/
    for(i=1;i<n;i++)
    {
        //k=a[i];
        j=i-1;
        while(j>=0 && a[j]>a[i])
        {
            a[j+1]=a[j];
            j=j-1;
        }
        a[j+1]=a[i];
    }
    printf("The elements of the array are: ");
    for(x=0;x<n;x++)
        printf("%d ", a[x]);
    return 0;
}

有人可以解释一下吗?在 while 循环期间做任何改变变量 'i' 的值。

k=a[i] 保存值,因为 while 循环

while (...) {
   a[j+1] =a[j];
}

在第一次迭代时覆盖 a[i],因为 ji-1 开始,所以 j+1 在第一次迭代时是 i