插入排序有两个不同的结果

时间:2013-09-17 02:58:53

标签: c sorting insertion-sort

当我以这种方式编码时,我得到了正确的结果.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 个答案:

答案 0 :(得分: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]);
}

我认为这是正确的格式,如上所示,第二组中的差异是在else中执行的arr[x]=temp

答案 1 :(得分: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]);

}

答案 2 :(得分:0)

两者之间存在差异。

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

前一个:

内环以x = 0(或)x = i结束。在这里,您将 a [x]替换为temp 。很明显, 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-loop 本身来控制代码,而不是使用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;
}

答案 3 :(得分:0)

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