选择排序(Selection Sort)
1、算法介绍
- 从原始的数组中选出最小的一个数据(如果当前位置为最小值则不进行交换),将其与数组第一个位置的数据进行交换。
- 完成一次交换之后,第一个位置的数据便是最小值。
- 固定了第一个位置之后,从剩下的 n - 1 个数据中选出其中最小的数据将其与第二个位置进行交换。
- 完成二次交换之后,第二个位置的数据便是次小值。
- 固定了第二个位置之后,从剩下的 n - 2 个数据中选出其中最小的数据将其与第三个位置进行交换。
- 重复执行以上过程,直到最后的两个数据交换完成(需要循环数组长度 - 1 次)
2、举例演示(循环 n - 1 次)---- n 为数组长度
原数组: [117, 101, 106, 155, 112]
第一次排序后:[101, 117, 106, 155, 112] 交换101 和 117
第二次排序后:[101, 106, 117, 155, 112] 交换106 和 117
第三次排序后:[101, 106, 112, 155, 117] 交换112 和 117
第四次排序后:[101, 106, 112, 117, 155] 交换117 和 155
3、图解
4、代码实现
package sort;
import java.util.Arrays;
/**
* <p>
*
* </p>
*
* @author: D
* @since: 2020/9/8
* @version: 1
*/
public class SelectionSortDemo {
public static void main(String[] args) {
int[] arr = {117, 101, 106, 155, 112};
selectionSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void selectionSort(int[] arr) {
// 标记当前交换的位置
int index;
// 临时变量
int temp;
for (int i = 0; i < arr.length - 1; i++) {
index = i;
System.out.println("第" + (i + 1) + "次交换前: " + Arrays.toString(arr));
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[index]) {
index = j;
System.out.println("下标[" + j +"," + arr.length + "] 中" + "最小的数 = " + arr[j]);
}
}
// 如果当前位置的数据不是最小的则进行交换操作,否则不进行交换
if (index != i) {
temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
System.out.println("第" + (i + 1) + "次交换后: " + Arrays.toString(arr));
} else {
System.out.println("未发生交换");
}
System.out.println();
}
}
}