基本介绍
选择排序是从一组数据中,按指定的规则选出某个元素,在按照规定交换位置后达到排序的目的;
排序思想
从头至尾扫描数组,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列;
代码实现
例子:
给定数组 [3,5, 6, 2, 4],要求按照从左到右、从小到大的顺序进行排序
分析思路:
选择排序一个需要进行数组大小-1轮排序;先假设当前数为最小数,然后和后面每一个数进行比较,如果发现有比当前最小数更小的数,就更新当前最小数和下标;当一轮数组遍历到最后时,就可以获取到本轮最小数和下标,并进行交换;
1)在{3,5,6,2,4}中,我们开始假设第一个数3为最小值,下标为0,进行遍历;5比3大,6比3 大,3 比2大,更新最小值为2,4比2大,遍历结束,进行替换后
结果:{2} {5,6,3,4}
2) 在{5,6,3,4}中,我们开始假设5为最小值,进行遍历,5 比6小,5比3大,更新最小值为3,3比4小,遍历结束,进行替换后
结果:{2,3} {6,5,4}
3) 在{6,5,4}中,我们开始假设6为最小值,进行遍历;发现5比6小,更新最小值为5,进行遍历,4比5小,更新最小值为4,遍历结束,进行替换后
结果:{2,3,4} {5,6}
4) 在{5,6}中,我们开始假设5为最小值,进行遍历;发现5比6小,遍历结束
结果:{2,3,4,5} {6}
最终结果为: 2,3,4,5,6
替换规则:
一轮遍历后,我们将开始保存的最小值arr[i]和记录最小值minNum、下标minIndex对应的值进行替换
arr[minIndex] = arr[i]
arr[i] = minNum;
将上述一步步分析转化代码为如下:
//选择排序 3 5 6 2 4
int[] arr = new int[]{3, 5, 6, 2, 4};
int minIndex = 0;
int minNum = arr[0];
for (int i = 1; i < arr.length; i++) {
if (minNum > arr[i]) {
minIndex = i;
minNum = arr[i];
}
}
if (minIndex != 0) {
arr[minIndex] = arr[0];
arr[0] = minNum;
}
System.out.println("第一次选择排序后:" + Arrays.toString(arr));
minIndex = 1;
minNum = arr[1];
for (int i = 2; i < arr.length; i++) {
if (minNum > arr[i]){
minIndex = i;
minNum = arr[i];
}
}
if (minIndex != 1) {
arr[minIndex] = arr[1];
arr[1] = minNum;
}
System.out.println("第二次选择排序后:" + Arrays.toString(arr));
minIndex = 2;
minNum = arr[2];
for (int i = 3; i < arr.length; i++) {
if (minNum > arr[i]){
minIndex = i;
minNum = arr[i];
}
}
if (minIndex != 2) {
arr[minIndex] = arr[2];
arr[2] = minNum;
}
System.out.println("第三次选择排序后:" + Arrays.toString(arr));
minIndex = 3;
minNum = arr[3];
for (int i = 4; i < arr.length; i++) {
if (minNum > arr[i]){
minIndex = i;
minNum = arr[i];
}
}
if (minIndex != 3) {
arr[minIndex] = arr[3];
arr[3] = minNum;
}
System.out.println("第四次选择排序后:" + Arrays.toString(arr));
运行结果:
第一次选择排序后:[2, 5, 6, 3, 4]
第二次选择排序后:[2, 3, 6, 5, 4]
第三次选择排序后:[2, 3, 4, 5, 6]
第四次选择排序后:[2, 3, 4, 5, 6]
选择排序一共有数组大小-1轮排序,遍历到只剩一个数的时候就是数组的最大值;将上面分步骤的代码进行整合,代码如下:
int[] arr = new int[]{3, 5, 6, 2, 4};
for (int j = 0; j < arr.length - 1; j++) {
int minIndex = j;
int minNum = arr[j];
for (int i = j+1; i < arr.length; i++) {
if (minNum > arr[i]) {
minIndex = i;
minNum = arr[i];
}
}
if (minIndex != j) {
arr[minIndex] = arr[j];
arr[j] = minNum;
}
System.out.println("第"+(j+1)+"次选择排序后:" + Arrays.toString(arr));
}
运行结果:
第1次选择排序后:[2, 5, 6, 3, 4]
第2次选择排序后:[2, 3, 6, 5, 4]
第3次选择排序后:[2, 3, 4, 5, 6]
第4次选择排序后:[2, 3, 4, 5, 6]