选择排序
-
原理:按照从矮到高(从高到矮)的顺序摆放好
-
步骤:第一次从未排序的序列中选出最小的一个元素,存放在第一个位置,然后再从剩余的未排序序列找到最小的元素,放在已排序序列的末尾
-
编程思路(从小到大)
- 外层循环:第一次找到最小的数,和第一个数交换位置,第二次从第一个数之后找最小的数,和第二个数交换位置,第三次从第二个数之后找最小的数,和第三个数交换位置。。。。。。。
- 内层循环:第一次假设第一个数最小,拿这个数依次和后面的数比较大小,只要有比第一个数还小的数,那么就假设这个数为最小的数
- 举例:以{1,2,4,3,5,0}为例,
- 第一次循环:假设最小的是1,然后1和2比,发现1比2小,就假设1是最小,然后再和4比,再和3比,再和5比,最后假设的是0最小,那么0和1交换位置,0就在第一位了。变成{0,2,4,3,5,1}把0放在第1位
- 第二次循环:从0后面开始,假设最小为2,然后和4相比,和1相比,发现1比2小,就假设1最小,最后1和2交换位置变成{0,1,4,3,5,2}把1放在第2位
- 第三次循环:{0,1,2,3,5,4}把2放在第3位
- 第四次循环:{0,1,2,3,5,4}本来假设的3最小,不用交换位置
- 第五次循环:{0,1,2,3,4,5}把4放在第5位,第六位自动归为
- 总结思路
- 六个数,循环五次(length-1)
- 假设最小的数应该放在中间值里(temp)
- 第一次循环比较五次,第二次循环比较4次,第三次循环比较3次,第四次循环比较2次,第五次循环比较一次(外层i增长)
- 如果有刚好假设的最小的数就在最开始的位置不用交换位置(判断中间值是否改变)
-
代码实现
package cn.javase.selfstudy; public class ArraySelectSort { public static void main(String[] args) { int[] arr = new int[]{10, 12, 33, 6, 100, 90, 46, 1, 5, 7, 3}; System.out.print("["); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + (i < arr.length - 1 ? "," : "]")); }//6 7 8 9遍历原数组元素 System.out.println(); System.out.println("---------------------"); int min; for (int i = 0; i < arr.length - 1; i++) { min = i;//定义一个中间值暂存假设最小值的下标 for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[min]) {//比较是否比假设的最小值小 min = j;//如果小就把该数的下标给中间值 } } if (i != min) {//判断假设的最小值下标是否有变化 arr[i] = arr[i] + arr[min]; arr[min] = arr[i] - arr[min]; arr[i] = arr[i] - arr[min]; }//21 22 23把最小值放在未排序列的第一位 System.out.print("["); for (int x = 0; x < arr.length; x++) { System.out.print(arr[x] + (x < arr.length - 1 ? "," : "]")); }//25 26 27 打印每一次交换后的结果 System.out.println(); } System.out.println("---------------------"); System.out.print("["); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + (i < arr.length - 1 ? "," : "]")); }//打印排序后的数组 System.out.println(); } }
[10,12,33,6,100,90,46,1,5,7,3]//原数组 --------------------- [1,12,33,6,100,90,46,10,5,7,3]//找到最小数1放在第1位 [1,3,33,6,100,90,46,10,5,7,12]//找到最小数3放在第2位 [1,3,5,6,100,90,46,10,33,7,12]//找到最小数5放在第3位 [1,3,5,6,100,90,46,10,33,7,12]//找到最小数6放在第4位 [1,3,5,6,7,90,46,10,33,100,12]//找到最小数7放在第5位 [1,3,5,6,7,10,46,90,33,100,12]//找到最小数10放在第6位 [1,3,5,6,7,10,12,90,33,100,46]//找到最小数12放在第7位 [1,3,5,6,7,10,12,33,90,100,46]//找到最小数33放在第8位 [1,3,5,6,7,10,12,33,46,100,90]//找到最小数46放在第9位 [1,3,5,6,7,10,12,33,46,90,100]//找到最小数90放在第10位,100自动归位 --------------------- [1,3,5,6,7,10,12,33,46,90,100]//排序后的数组