老师您先看图,有个小细节的问题,没搞懂

来源:2-6 插入排序法的改进

我会回来的333

2021-04-28

图片描述
图片描述
图片描述
这for循环的循环条件,为啥把这个a[j-1]>e也放进去了呢,没搞懂逻辑,
用正确的测试,这样优化后速度是没有优化时的4分之1左右,我就记住了您说的一句话,不优化时,每次交换的背后都有3次的赋值再加上访问数组所在元素的时间,优化后就只进行了1次赋值操作,这么一看结果差不多昂,
图片描述
逻辑感觉太绕了怎么办呀???唉对了,老师昨天提问的那个问题,我想了个法,我现在不用反射写那个通用数组测试时间方法了,我导了个包,改这么麻烦的测了,哈哈哈,太菜了,

写回答

2回答

liuyubobobo

2021-04-29

for(j = i; j > 0 && a[j - 1] > e; j --) 和

for(j = i; j > 0; j --) if(a[j - 1] > e) ... 是不等价的。


前者是循环结束的条件,在不满足时退出循环;后这不是。


我建议你首先使用一个小数据量,比如只有 4 个数据或者 8 个数据,测试一下,看是否有问题?如果有问题,用单步跟踪的方式一步一步跟一遍代码,看看每一步程序是怎么执行的,各个变量是怎么变化的?和你想象的是否一样?如果不一样,那里和你想象的不一样?自己哪里想错了?


进步就再这个过程中哦。


继续加油!:)

1
1
我会回来的333
您那个逻辑感觉有点复杂,我又搞了个新逻辑,老师您看下,
2021-04-29
共1条回复

我会回来的333

提问者

2021-04-29

//img.mukewang.com/szimg/608a5a14094aea2608710720.jpg

真调出来了,老师,我先用的5个元素debug的,先一步一步跟,然后反复重启debug重新生成数组,看每次头两三轮循环,想了好久,我上面那个出问题在最后一步a[j]=e问题上,如果改成您写的代码那肯定是没问题,因为我想不出来您那个变量是怎么想到那么用的,有点精巧,我想了个新的逻辑,自己想的这个逻辑,也能跑通,但就是时间上有点长,和没有优化过一样,我这个好像是多了好几次无用的判断,再加上number赋值时间,上涨到10万元素我看了下打印没啥问题,这个debug细节记住了,好好学一下debug,以前调程序老靠眼看,谁知道脑子和眼都不好用啊,厉害老师 : )

0
1
liuyubobobo
大赞!这样做看似慢,但其实是真正理解了,同时这样的过程绝对让你对程序的理解更深刻了。一直保持这样的学习热情和态度,将来你就是大神!继续加油!:)
2021-04-30
共1条回复

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程