关于minIndex的问题

关于minIndex的问题

波波老师,新年快乐哈。有个问题请教下,这个地方是不是不应该采用minIndex中间变量,感觉没有太大的必要,而且还发现个问题,我多试几个数组,会导致输出结果没有满足从小到大排序需求。

这是有中间变量minIndex的

https://img1.sycdn.imooc.com//climg/61f7fef40908704311950872.jpg

这是没有minIndex的

https://img1.sycdn.imooc.com//climg/61f7ff1209f3340b15780746.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
liuyubobobo 2022-02-01 07:23:31

你的截图 2 的代码是正确的。不过这个代码调用 swap 的次数远远多于使用 minIndex 的代码。而一次 swap 是三次赋值操作,而使用 minIndex 只需要一次赋值操作。


实际上,这能看出选择排序的一个性质:选择排序是众多排序算法中唯一一个只需要交换 n 次就能完成排序的排序算法。(但需要比较 O(n^2) 次。)


不过,这个性质并没有那么重要,因为不管怎么样,选择排序依然是一个 O(n^2) 级别的算法,所以我也没有过度强调。这类“常数级别”的优化问题不是这个课程的重点。到后续学习你就会看到,一个 O(nlogn) 的排序算法,实现得再烂,也能秒排出 10 万,100 万级别的数据,而一个 O(n^2) 的排序算法,不管怎么实现,连 10 万的数据都将需要好几秒才能搞定。这就是算法的意义。关注复杂度级别的算法优化,是这个课程的重要。


==========


不过我简单测试了一下,对于 10 万的数据,使用 Java 8 和 Java 14,在我的环境下,不使用 minIndex 会比使用 minIndex 慢 3 秒左右。(不同的环境,不同的 Java 版本,测试结果可能有出入。)这个测试可以侧面说明:你给出的代码2看似更“简洁”了,但其实需要的操作是更多的。


具体的测试方式,课程后续会介绍。


https://img1.sycdn.imooc.com//climg/61f86e7d0909168a12640196.jpg


==========


对于你都说的“多试几个数组,会导致输出结果没有满足从小到大排序需求”,对于课程的代码,可能性不大。如果真的有,请告诉我:到底是什么测试数据出现了你说的情况?能复现错误是调试错误的第一步。

(大概率是你测试的时候调整了代码,导致运行的代码本身是有问题的。)


新年快乐。继续加油!:)



  • 提问者 潇歌 #1

    哦哦,我知道问题在哪了,swap函数调用放在第二个for循环体里面去了,导致minIndex最终取得的值是最后一次比较最小的值。有关于在循环体加入中间变量的逻辑是以前一直没考虑到,可能是执行起来时间差别不大,所以忽略了这点

    2022-02-01 22:02:13
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2583    人
  • 解答问题       1082    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师