选择排序
- 什么是选择排序 :
选择排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。
- 排序规则:
(1)选择排序一共有数组大小-1轮排序
(2)每一轮排序,又是一个循环(循环的规则)
2.1 先假定当前这个数(如果是第一轮则是第一个数)是最小数
2.2 将假定的最小数和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,并得到下标
2.3 当遍历到数组的最后时,就得到本轮最小数和下标
2.4 交换
- 代码实现:
推导过程:
//保存最小值
int min;
//保存最小值的索引
int minIndex;
//假定最小值为索引为0的元素
min = arr[0];
minIndex = 0;
for(int i = 0 + 1;i < arr.length;i++) {
if(min > arr[i]) {
min = arr[i];
minIndex = i;
}
}
//经过这一轮循环后,数组的第一个元素即为最小值
//比较过程中会出现某轮假定最小数为true的情况
//所以我们在交换前判断是否为真的最小数,即下标是否还为假定最小数它本身
if(minIndex != 0) {
arr[minIndex] = arr[0];
arr[0] = min;
}
System.out.println("第一轮:");
System.out.println(Arrays.toString(arr));
System.out.println("======================");
min = arr[1];
minIndex = 1;
//经过一轮后,最小值不再假定为索引为0的元素,而是假设下一个元素为最小值
for(int i = 1 +1;i < arr.length;i++) {
if(min > arr[i]) {
min = arr[i];
minIndex = i;
}
}
//经过这一轮循环后,数组的第二个元素即为倒数第二小的值
if(minIndex != 1) {
arr[minIndex] = arr[1];
arr[1] = min;
}
System.out.println("第二轮:");
System.out.println(Arrays.toString(arr));
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int min;
int minIndex;
min = arr[i];
minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (min > arr[j]) {
// 判断条件为min < arr[j]可以得到从大到小的结果
// 重置最小值和最小值的下标
min = arr[j];
minIndex = j;
}
}
if (minIndex != i) {
arr[minIndex] = arr[i];
arr[i] = min;
}
// System.out.println("第"+j+"轮:");
// System.out.println(Arrays.toString(arr));
}
* 选择排序思想:分别假定第一到倒数第二个元素为最小值,然后去比较数组中没有排过序的数。
比如我现在假定第一个数为最小,如果经过内层循环遍历假定最小数的后面元素后发现假定最小数不是最小后,
出来外层循环后就置为最小(出来后已经找到最小数了),然后假定第二个数为最小,第二个假定最小数依此类推。
* 选择排序外层决定轮数(也即第1到倒数第二个元素),内层决定比较元素的个数(根据外层决定)。
* 选择排序核心:定义两个变量min,minIndex,分别记录最小值和最小值的下标。
* 他们的作用:
在内层循环中,如果我们假定的最小值不是为最小,就重置这两个数;
在外层循环中,将假定最小值arr[j](可能不是真的最小)赋值给真的最小值 --> arr[minIndex]=arr[i];
然后将假定的最小值赋值为真的最小值 --> arr[i] = min