选择排序,字面上理解为先选择,后排序,我们来看看官方怎么说的:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
简单点来说就是从已有的数组里面每次选出一个最小(或最大的)的数值
(代码在最后)
(图引自互联网)
博主觉得实现算法的思想更重要,接下来说说我的思想(可供参考):
1.首先排序一类的算法肯定要用循环来做,找好循环所需要的条件:排序的次数为(数组长度-1),每排完一轮,前面的元素已经排好一位,最后只剩一个就是最大(最小)的那个,就不用排了
所以外循环为 for (int i = 0; i < arr.length - 1; i++)
2.既然是每轮排序选出最值,所以还得嵌套一个循环,怎么找内循环的条件呢?第一次找出第一个最值了,然后下一轮找的次数就该-1了,以此类推,每进行一轮循环,次数少一次,那么内循换从哪开始呢?从i+1开始,因为每循环一轮,前面的0~i个都已经排好了,不太明白的小伙伴可以捋一下思路,循环次数为数组的长度,而不是数组长度-1了,因为要保证这一轮所有元素均参与排序
所以内循换为 for (int j = i + 1; j < arr.length; j++)
3. 既然整体框架已经确定了,就要寻找最值了,内循环里加个if判断,以找出最值然后赋值给临时变量,下面我有解释临时变量的来历
if (arr[j] < arr[MinIndex]) { MinIndex = j; MinValue = arr[j]; }
4. 找出最值以后,就要保存这个数了,这里我们提前在外循环定义临时变量把当前的arr[ i ]以及下标 i 保存好,为什么这么做呢?因为如果找出这一轮的最值,需要把最值和当前的arr[ i ]交换一下。
int MinIndex = i; int MinValue = arr[MinIndex];
5. 最后要赋值了,这时候已经找出来而且跳出内循换了,因为最值以及下标已经保存到临时变量里了,所以先把arr[ i ] 赋给最值,后把最值赋给arr[ i ],只能是这个顺序,否则当前的arr[ i ]会丢失。具体还请小伙伴多思考思考。代码如下。
package com.gaojiale.PaiXu;
import java.util.Arrays;
/*
*
* 选择排序
* */
public class selectionsort {
public static void main(String[] args) {
int arr[] = {9,5,-1,23,66,11};
SelectSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void SelectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int MinIndex = i;
int MinValue = arr[MinIndex];
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[MinIndex]) {
MinIndex = j;
MinValue = arr[j];
}
}
arr[MinIndex] = arr[i];
arr[i] = MinValue;
}
}
}
有问题欢迎下方留言,侵删。