Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 按插入排序对数组进行排序_C_Insertion Sort - Fatal编程技术网

C 按插入排序对数组进行排序

C 按插入排序对数组进行排序,c,insertion-sort,C,Insertion Sort,我正在尝试使用插入排序对数组进行排序。 我使用另一个名为rank的数组来映射指向原始数组,而不是更改和重新排列数组本身的元素。 这是我的密码 int i,j; int ar[] = {50,14,51,25,10}; int rank[] = {0,1,2,3,4}; for(i=1 ; i< 5 ; ++i) // second element onwards { int temp = rank[i]; // stores current value in temp vari

我正在尝试使用插入排序对数组进行排序。 我使用另一个名为rank的数组来映射指向原始数组,而不是更改和重新排列数组本身的元素。 这是我的密码

int i,j;
int ar[] = {50,14,51,25,10};
int rank[] = {0,1,2,3,4};
for(i=1 ; i< 5 ; ++i)  // second element onwards
{
    int temp = rank[i];  // stores current value in temp variable      

    /**
     * temp = 1
     * j = 0 
     */
    j = rank[i] - 1;
    while ( ar[temp] < ar[ rank[j] ] && j > -1)
    {
        rank[j+1] = rank[j];      // move elemnts in map forward
        j--;
    } // end loop

    // insert temp at proper place
    rank[j+1] = temp;    

}

for(i=0 ; i< 5 ; ++i)
    printf("Rank : %d, Number : %d \n",rank[i],ar[i]);
但是,它没有给出预期的输出。有人能指出逻辑上的错误是什么吗

rank[j+1] = rank[j]

毫无意义。您应该交换它们。

这是我在学习数据结构类时使用的代码

在while条件下,它检查V。。。在循环内部,它移动V中的元素

在您的代码中,您在一个数组中比较,在另一个数组中移动。。。如果需要元素的原始位置,可以将数组复制到新数组中并对新数组进行排序,而不是创建那些列。。。如果你真的需要这些等级,我相信你可以在排序时创建


您的逻辑缺陷如下所示: 在这个代码段

   while ( ar[temp] < ar[ rank[j] ] && j > -1)
    {
        rank[j+1] = rank[j];      // move elemnts in map forward
        j--;
    } // end loop
秩[j]指ar[j]处的值的秩

当您使用ar[rank[j]]时,您将ar[temp]与在ar[j]的值的秩处索引的值进行比较,这意味着您没有与秩[]的排序部分中的最大值进行比较

因此,即使ar[temp]是第二个最小值,您也可能无法进入此循环

例如:

到目前为止,在循环2 i=2期间

ar[]:{50,14,51,25,10}

秩[]:{1,0,2,3,4};{1,0}是秩[]的排序部分

仅0表示14是ar[]的扫描部分{50,14}中的最小值 而ar[rank[2]]ar[0]恰好是ar[]的扫描部分{50,14}中的最大值


如果此值ar[rank[2]]不是最大值,并且恰好小于ar[temp],则程序将跳过循环。即使ar[temp]比ar[]中的所有其他值都小

您也必须进一步缩小它的范围,而不仅仅是它不起作用。获取一个简单的测试用例,使用调试器并跟踪代码的执行。很可能,这将帮助您找到解决方案。如果没有,它至少会将其缩小到代码的特定部分。j=rank[i]-1;。您是在尝试减少元素i中的值还是在元素i之前访问该元素?我使用了netbeans调试器。我发现j是到-2,而不是停在-1。所以我在while循环中添加了一个额外的约束j>-1。现在当j=-1时,while循环中的条件应该返回false。但这是真的,我不知道为什么。你在移动排名中的元素,但继续比较AR中从不移动的元素。。。那可能是你的problem@nightshade我没抓到你。那么我应该在while循环中设置什么条件呢?您能以编程方式编写它吗?如何将其添加到代码部分而不是图像中?也许也能翻译一下。。。