关于选择排序(SelectionSort)第二层for循环j=i+1的疑问
关于选择排序内层循环
j初始化为i+1的解释 嘿,我来帮你把这个点掰明白!首先咱们先回顾下你这段代码的逻辑——这是一个降序版本的选择排序:每一轮外层循环(i控制的循环),我们要把当前i位置的元素替换成从i到数组末尾的最大元素,这样一步步把数组从大到小排好序。
那为什么内层循环的j要从i+1开始呢?主要有两个核心原因:
1. 避免无意义的自我比较
i是当前我们要“敲定”的位置,我们的目标是在剩下的未排序元素里找最大的来和array[i]对比。如果j从i开始,那第一次比较就是array[i]和array[i]自己,这完全是浪费时间,对排序没有任何帮助。从i+1开始就跳过了这种无意义的操作。
2. 跳过已经排好序的前半部分
外层循环执行到第i轮时,0到i-1位置的元素已经是整个数组里最大的i个元素了(因为每一轮都把最大的放到了当前i的位置)。这些元素比i及之后的所有元素都大(你的代码是降序),所以根本不需要再拿array[i]和它们比较——不仅没用,要是不小心交换了还会破坏已经排好的顺序。
举个实际例子更清楚
比如你有数组[3,1,4,2]:
- 第一轮
i=0,j从1开始:依次对比1和3(不交换)、4和3(交换后数组变成[4,1,3,2])、2和4(不交换),结束后array[0]是整个数组最大的元素。 - 第二轮
i=1,j从2开始:对比3和1(交换后数组变成[4,3,1,2])、2和3(不交换),结束后array[1]是剩下元素里最大的。 - 第三轮
i=2,j从3开始:对比2和1(交换后数组变成[4,3,2,1]),排序完成。
如果j从0开始呢?比如第二轮i=1时j=0,会拿array[0](也就是4)和array[1](1)对比,触发交换,把已经排好的最大元素又换回到后面,直接打乱了排序结果,这就完全错了!
所以说,j初始化为i+1是选择排序逻辑里既高效又必要的设计哦~
内容的提问来源于stack exchange,提问作者Dominic
相关产品推荐
相关产品推荐

