-2

当我以这种方式编码时,我得到了正确的结果。1、2、3、4、6,

#include<stdio.h>
main()
{
    int i,x,temp,arr[5]={4,3,2,1,6};
    for(i=1;i<5;i++){
        temp=arr[i];
        for(x=i;x>0;x--){
            if(arr[x-1]>temp)
                arr[x]=arr[x-1];
            else 
                break;
        }arr[x]=temp;
    }
    for(i=0;i<5;i++)
    printf("%i,",arr[i]);
}

但是这样我得到了 4,4,4,4,6,一个不正确的答案。

#include<stdio.h>
main(){
    int i,x,temp,arr[5]={4,3,2,1,6};
    for(i=1;i<5;i++){
        temp=arr[i];
        for(x=i;x>0;x--){
            if(arr[x-1]>temp)
                arr[x]=arr[x-1];
            else 
            {
                arr[x]=temp;
                break;
            }
        }
    }
    for(i=0;i<5;i++)
    printf("%i,",arr[i]);
}

但看起来两者都是一样的。你能解释一下吗?

4

4 回答 4

0

1:

#include<stdio.h>
main(){
  int i,x,temp,arr[5]={4,3,2,1,6};
  for(i=1;i<5;i++){
    temp=arr[i];
    for(x=i;x>0;x--){
      if(arr[x-1]>temp)
        arr[x]=arr[x-1];
      else 
        break;
    }
    arr[x]=temp;
  }
  for(i=0;i<5;i++);
  printf("%i,",arr[i]);
}

2:

#include<stdio.h>
main(){
  int i,x,temp,arr[5]={4,3,2,1,6};
  for(i=1;i<5;i++){
    temp=arr[i];
    for(x=i;x>0;x--){
      if(arr[x-1]>temp)
        arr[x]=arr[x-1];
      else {
        arr[x]=temp;
        break;
      }
    }
  }
  for(i=0;i<5;i++)
  printf("%i,",arr[i]);
}

我认为这是正确的格式,如上所示,第二组的不同之处在于arr[x]=tempelse 中的执行。

于 2013-09-17T03:23:07.553 回答
0

你的第二种情况应该是这样的......

#include<stdio.h>
main(){
    int i,x,temp,arr[5]={4,3,2,1,6};
    for(i=1;i<5;i++){
        temp=arr[i];
        for(x=i;x>0;x--){
            if(arr[x-1]>temp){
                arr[x]=arr[x-1];
                arr[x-1]=temp;// earlier you were missing this part to swap the values
            }
            else 
            {
                //arr[x]=temp; this doesn't need here.
                break;
            }
        }//arr[x]=temp; Here it will always executed after your for loop is executed.
    }
    for(i=0;i<5;i++)
    printf("%i,",arr[i]);

}
于 2013-09-17T03:52:48.137 回答
0

两者之间是有区别的。

注意: temp 将被视为两个代码中该传递的最小元素。因为我们在索引 i 到 0 时搜索大于 temp 的值。

前一个:

内部循环以 x = 0(或)x = i 结束。在这里,您将a[x] 替换为 temp。所以很明显,温度(该通道的最小值)将正确插入到适当的位置。

                    +----------------+
 Initial Array      |    4 3 2 1 6   |
                    +----------------+

+-------------------+                |  +-------------------+  
|       i = 1       |  temp = 3      |  |       i = 2       |   temp = 2
+-------+-----------+                |  +-------+-----------+
| x = 1 | 4 4 2 1 6 | arr[1] = 4     |  | x = 2 | 3 4 4 1 6 |   arr[2] = 4
+-------+-----------+                |  +-------+-----------+  
|     3 4 2 1 6     | arr[0] = temp  |  | x = 1 | 3 3 4 1 6 |   arr[1] = 3
+-------------------+                |  +-------+-----------+
                                     |  |     2 3 4 1 6     |   arr[0] = temp
                                     |  +-------------------+

+-------------------+                |  +-------------------+  
|       i = 3       |  temp = 1      |  |       i = 4       |  temp = 6
+-------+-----------+                |  +-------------------+
| x = 3 | 2 3 4 4 6 |  arr[3] = 4    |  |     1 2 3 4 6     | arr[4] = temp  
+-------+-----------+                |  +-------------------+
| x = 2 | 2 3 3 4 6 |  arr[2] = 3    |  
+-------+-----------+                |  
| x = 1 | 2 2 3 4 6 |  arr[1] = 2    |  
+-------+-----------+                |
|     1 2 3 4 6     |  arr[0] = temp |
+-------------------+                |

后一种:

这里,

  if arr[x-1] > temp do arr[x] = arr[x-1]
  else do arr[x] = temp

所以没有进行正确的插入并且值会丢失。

                       +----------------+
    Initial Array      |    4 3 2 1 6   |
                       +----------------+

+-------------------+                |  +-------------------+  
|       i = 1       |  temp = 3      |  |       i = 2       |   temp = 2
+-------+-----------+                |  +-------+-----------+
| x = 1 | 4 4 2 1 6 | arr[1] = 4     |  | x = 2 | 4 4 4 1 6 |   arr[2] = 4
+-------+-----------+                |  +-------+-----------+  
|     4 4 2 1 6     |                |  | x = 1 | 4 4 4 1 6 |   arr[1] = 4
+-------------------+                |  +-------+-----------+
                                     |  |     4 4 4 1 6     |   
                                     |  +-------------------+

+-------------------+                |  +-------------------+  
|       i = 3       |  temp = 1      |  |       i = 4       |  temp = 6
+-------+-----------+                |  +-------------------+
| x = 3 | 4 4 4 4 6 |  arr[3] = 4    |  |     4 4 4 4 6     | arr[4] = temp  
+-------+-----------+                |  +-------------------+
| x = 2 | 4 4 4 4 6 |  arr[2] = 4    |  
+-------+-----------+                |  
| x = 1 | 4 4 4 4 6 |  arr[1] = 4    |  
+-------+-----------+                |
|     4 4 4 4 6     |                |
+-------------------+                |

您可以使用for 循环本身来控制代码,而不是使用 break 。

#include <stdio.h>
int main()
{
    int i,x,temp,arr[5]={5,6,5,1,2};
    for(i=1;i<5;i++)
    {
         temp=arr[i];
         for(x=i;arr[x-1]>temp;x--)
             arr[x]=arr[x-1];
         arr[x]=temp;
    }
    for(i=0;i<5;i++)
        printf("\t%d",arr[i]);
return 0;
}
于 2013-09-17T06:51:18.227 回答
0

在您的第二种情况下,arr[x]=temp只要temp小于0and之间的数组中的所有值都不会执行i,而在这种情况下temp应该继续执行arr[0](如第一个版本所做的那样)。由于单元格已正确向右移动,arr[0]实际上每次发生这种情况时都会复制而不是简单地移动(在您的示例中,对于除最后一个单元格之外的所有单元格,导致您的最终输出)。

于 2013-09-17T06:51:41.793 回答