当我以这种方式编码时,我得到了正确的结果.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]);
}
但看起来两者都是一样的。你解释一下吗?
答案 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
小于temp
和0
之间数组中的所有值,就不会执行i
,temp
在这种情况下应该继续arr[0]
(正如第一个版本所做的那样)。由于单元格正确地向右移动,arr[0]
实际上是复制而不是每次发生时简单移动(在您的示例中,除了最后一个单元格之外的所有单元格,导致您的最终输出)。