选择排序的思想:本质上来说,选择排序其实是我们最容易想到的一种排序算法,比如有int[]={8,5,43,6,7},它是从首位开始,指针指向当前位置,然后和之后的每一位开始比较,如果后面的要小于当前位,则改变当前指针位置,一次遍历完成后指针指向的位置就是这一次遍历所找到的最小的数,和遍历的首位交换位置。然后遍历第二次直至完成有序。
是不是说的不太直观?
待排序数组:arr={8,5,43,6,7}
1.指针minPos=0指向arr[minPos]=8,arr[minPos]与5比较小吗?yes,此时做什么呢?当然是移动指针了(指针会始终指向两者比较中的小者),此时minPos=1;
2. arr[minPos]=5与43比较小吗?no,与6,7呢?也是no,此时最小数的指针就确定了minPos=1
3.8和minPos指向的数做交换,那么到这里一次排序就完成了,结果={5,8,43,6,7}
4.以此类推,把后几次的比较完结果也就出来了
代码怎么写,别急,从第一次循环开始,我们慢慢推,千万别死记硬背!!!
第一次遍历:
第一次遍历结果是什么大家先想一下。答案在末尾
第一次完成了,剩下的应该就不难了吧:
问题来了,时间复杂度怎么算?空间复杂度?
别急,往下看:
空间复杂度好说, 前面的文章我说了,空间复杂度是一次排序完利用的额外的空间,想下,快排有用到额外的空间吗?答案是没有,所以空间复杂度是O(1)
“额外”定义:比如待排序数组又复制了一份到内存,类似这种的就是额外空间
时间复杂度:详细的怎么算的,就不再赘述,其实就是看循环了多少次,当然涉及到了低次位取舍和简单的等差数列,简单来说就是看内层for循环了多少次,这样就不难算出来了O(n2),即n的平方。
选择排序就这样完了吗?不不不 。有没有优化的点呢?双指针如何,每次和后两位比如何。大家可以思考下,还有最外层i<arr.length-1 是不是就行。哈哈哈,大家多思考~
看到这里发现了吗?选择排序其实是移动
第一次遍历结果:5 8 43 6 7
最终结果:5 6 7 8 43
下篇:冒泡排序