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

时间:2014-07-11 17:30:36

标签: c insertion-sort

我正在尝试使用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 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]);

但是,它没有给出预期的输出。任何人都可以指出逻辑中的错误是什么吗?

3 个答案:

答案 0 :(得分:1)

你的逻辑缺陷如下: 在此代码部分

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

rank[j]表示ar[j]处的值的等级。

当您使用ar[rank[j]]时,您将ar[temp]"the rank of the value at ar[ j ]"处的索引值进行比较,这意味着您没有与{{1}的已排序部分中的最大值进行比较}}

因此,即使rank[]是第二小的

,您也可能无法进入此循环

例如:

到目前为止,在循环#2 ar[temp]

期间
  

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

     

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

(i = 2)仅表示014中的最小值({50,14}的扫描部分) AND ar[]ar[rank[2]])恰好是ar[0]中最大的值({50,14}的扫描部分)巧合

如果此值(ar[])不是最大值,并且恰好小于ar[rank[2]],则程序将跳过循环。即使ar[temp]小于ar[temp]

中的所有其他值,也是如此

答案 1 :(得分:0)

rank[j+1] = rank[j]

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

答案 2 :(得分:0)

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

在while条件下,它检查V ...并在循环内部移动元素V ...

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