选择排序推演过程
选择排序推演过程
1. 找出数组中最大值和下角标为 0 的元素交换位置
思路:
一.先找出最大值
1.假设index为 0 ,下角标为 0 的元素就是最大值
2.遍历数组,用index依次和后续所有数据做比较
3.i 从1开始,自身和自身做比较没有意义
4.如果第一个元素小于第二个元素,说明第二个元素是较大值。赋值给index
5.用赋值后的index和第三个元素做比较,依次类推
6.遍历结束后,index就是最大值
二.交换位置
8.此种方法没有考虑极端情况,例如:0 位就是最大元素。加入限制貌似唯一的作用就是少循环一遍
int[] arr = {0, 3, 5, 7, 9, 2, 4, 6, 8, 10};
//存储最大值的下角标
int index = 0;
/*
先找出最大值
*/
for (int i = 1; i < arr.length; i++) {
if (arr[index] < arr[i]) {
//把每次判断的较大值传递给index
index = i;
}
}
//交换元素
int tmp = arr[index];
arr[index] = arr[0];
arr[0] = tmp;
2.找出数组中剩余最大值和下标为1的元素交换位
思路:
1.继续操作上面已经被操作过的数组
2.当前0位已经是全数组最大值了,不参与下面操作
3.index从1位开始,假设1位是当前最大值,不与自身比较
4.变量 i 从 2 开始遍历
5.如果 arr [ index ] 小于 arr [ i ] ,说明第二个元素是较大值。赋值给index
6.依次类推
7.得到剩余的最大值
8.最后交换index和1的值
//index从1位开始
index = 1;
//i 从 2 开始
for (int i = 2; i < arr.length; i++) {
if (arr[index] < arr[i]) {
index = i;
}
}
//交换位置
tmp = arr[index];
arr[index] = arr[1];
arr[1] = tmp;
System.out.println (Arrays.toString (arr));
3.选择排序
根据: 找出数组中最大值和下角标为 0 的元素交换位置 和 找出数组中剩余最大值和下标为1的元素交换位
可知:
- 可以快速找到(指定或者)下一位最大值,并且交换位置
- 遍历一次可以找到一个最大值,并且这个最大值只移动一次
- 每次遍历都会有一个最大值放在上一个最大值后面
推测
- 多次循环可以依次将下一个最大值,放在上一个最大值的后面
4.选择排序实现
代码方法(未优化)
private static void extracted1 (int[] arr) {
//选择排序
for (int i = 0; i < arr.length - 1; i++) {
int index = i;
for (int j = i + 1; j < arr.length; j++) {
//判断indx是否小于j,是则赋值给index,正序倒序取决于小于还是小于
if (arr[index] < arr[j]) {
index = j;
}
}
int temp = arr[index];
arr[index] = arr[i];
arr[i] = temp;
}
}