鱼C论坛

 找回密码
 立即注册
查看: 1792|回复: 4

[已解决]求助求助啊~

[复制链接]
发表于 2021-3-2 11:38:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
for里面判断这两种写法怎么结果不一样啊?自行调试绕晕了,还望大神指教下,有详细说明最好。谢谢!!

void insertion_sort(int arr[], int len)
{
        int i, j;
        for(i = 1; i < len; i++)
        {      
                int key = arr[i];      
                for(j = i -1; j >= 0 && arr[j] > key; j--)        //不同点
                {
                                arr[j+1] = arr[j];
                }
                arr[j + 1] = key;      
}

void insertion_sort(int arr[], int len)
{
        int i, j;
        for(i = 1; i < len; i++)
        {      
                int key = arr[i];      
                for(j = i -1; j >= 0 ; j--)      
                {
                                if(arr[j] > key)        //不同点
                                arr[j+1] = arr[j];
                }
                arr[j + 1] = key;      
}
最佳答案
2021-3-3 02:16:29
本帖最后由 洋洋痒 于 2021-3-3 02:37 编辑
小老虎007 发表于 2021-3-2 23:18
你好,我的疑问是把&&后面的条件判断,改成下面用if的方法效果是一样的吗?  我执行这个插入排序,下面的 ...


是不一样的,在if语句条件判断里,一旦不符合条件了,会立刻终止循环。
但是像你这样操作,即使 arr[j] > key为False你还会进入下一次循环,最终很可能导致某一次循环arr[j]又一次大于key了,既又符合条件了,就会执行arr[j+1] = arr[j];从而导致最终结果的错误。这就是区别

具体if语句的条件判断怎么写是要根据实际情况来的,要求什么就怎么写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-2 12:48:27 | 显示全部楼层

初始值;进入循环条件;循环变量增值
我以为昨天写的很明白了
for循环括号内有两个分号,分成三部分,第一部分都是初始值   i  初始值1     j 初始值是 i-1
第二部分都是进入循环的条件 第一个for条件是i < len      第二个for条件是 j >= 0 && arr[j] > key  这一整句话是一个条件,求这句话的真假
第三部分是循环变量增值   i 是一次循环增加1    j是一次循环减少1


你还有什么没明白的再问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-2 17:08:03 | 显示全部楼层
要搞清楚这个原因,对for语句熟悉就好了
for(表达式1; 表达式2; 表达式3)
{
}
for中各表达式楼上说的很详细了
for语句执行顺序是怎样的呢?
     首先初始化变量(也可以不初始化),表达式2再进行判断,成立进入for语句,不成立结束
      如果成立,执行表达式3,再进入第二部判断
了解了这些,我们就可以分析了:第一个是&&,不成立直接结束for语句
                                             第二个是判断j>=0,成立后会有个j--操作,结束条件是j<0时
说白了很简单,在两个程序内层for结束后可以打印j,一目了然
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-2 23:18:37 | 显示全部楼层
洋洋痒 发表于 2021-3-2 12:48
初始值;进入循环条件;循环变量增值
我以为昨天写的很明白了
for循环括号内有两个分号,分成三部分, ...

你好,我的疑问是把&&后面的条件判断,改成下面用if的方法效果是一样的吗?  我执行这个插入排序,下面的if的方法得不到正确的结果。(我感觉跟放在&&后面的方法这执行顺序不是一样吗)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-3 02:16:29 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 洋洋痒 于 2021-3-3 02:37 编辑
小老虎007 发表于 2021-3-2 23:18
你好,我的疑问是把&&后面的条件判断,改成下面用if的方法效果是一样的吗?  我执行这个插入排序,下面的 ...


是不一样的,在if语句条件判断里,一旦不符合条件了,会立刻终止循环。
但是像你这样操作,即使 arr[j] > key为False你还会进入下一次循环,最终很可能导致某一次循环arr[j]又一次大于key了,既又符合条件了,就会执行arr[j+1] = arr[j];从而导致最终结果的错误。这就是区别

具体if语句的条件判断怎么写是要根据实际情况来的,要求什么就怎么写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-10 02:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表