2014-07-11 158 views
-3

我想使用插入排序对数组进行排序。
我没有改变和重新排列数组本身的元素,而是使用另一个名为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]); 

但是,它不是给人一种预期的输出。任何人都可以指出逻辑中的错误吗?

+2

您将不得不进一步缩小它,而不仅仅是“它不工作”。获取简单的测试用例,使用调试器并跟踪代码的执行情况。很可能,这将帮助您找到解决方案。如果不是,它至少会缩小到特定的代码部分。 – wolfPack88

+0

'j =等级[i] -1;'。你是想减少元素“i”中的值还是在'i'之前访问元素? –

+0

我用netbeans调试器。我发现j是-2而不是停在-1。所以我在while循环中添加了额外的约束j> -1,当j = -1时,然后在while循环中应该返回false来终止它。但它是真实的,我不知道为什么。 – Shashi

回答

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 ]"索引值,这意味着你是不是比较在rank[]排序部分的最大价值。

因此,你可能不会进入这个循环即使ar[temp]次之

例如:

循环#期间到目前为止2 (i = 2)

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

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

0只意味着14{50,14}最小值 AND ar[rank[2]]ar[0])(的ar[]扫描部)仅恰好是在{50,14}巧合

如果此值(ar[rank[2]])不是最大的,恰好是比ar[temp]较小最大值(ar[]扫描的部分),你的程序将只跳过循环。即使ar[temp]小于ar[]的所有其他值

0
rank[j+1] = rank[j] 

没有意义。你应该交换它们。

0

这是代码,我不得不把数据结构上课的时候......

在它检查伏,而条件... ...和循环里面移动V中的元素...

在你在一个数组中进行比较的代码,然后在另一个数组中移动......如果你需要元素的原始位置,你可以将数组复制到一个新数组中,然后对新数组进行排序,而不是创建这些排列......(If你真的需要这些级别,我敢肯定你可以创建,而你排序)

+0

如何在代码部分添加而不是图片?也许翻译它... – dragosht