选择排序
先说一下该算法的优缺点
优点:效率高
缺点:无论数组混乱度高低,都必须遍历完才跳出算法,不稳定排序
这里使用一个倒序数组测试
{ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
图示
在图中,以下操作执行了九次,因为在这个例子中,首元素9就是最大的后面每次遇到的元素都比它小,min的值从9依次变成最后的0
if(arr[j] < arr[min]){
min = j;
}
比较难理解的是min的作用
我们想象第二次排序就好理解,i 下标从0++变成了1,这时候继续把最小元素下标假设给 i,然后用 j 循环找比它小的元素的下标。找到后把这个最小元素的下标赋值给min,这时min就相当于一个中间容器的作用。
min是必须存在的
因为我们注意到交换操作是发生在 j 的for循环外,用 i 和 min 控制元素位置进行交换
其实就是 i 先声明它位置上的元素是剩下的元素中最小的 i 之前的元素已经排好序了 然后就占在剩下的数组中第一的位置,这时候我们派出min在剩下的元素中找找看是不是有其他最小的元素,找到后和 i 换位置就行了,i 位置上的值到底多大多小无所谓
每次 i 循环的效果就是把数组中最小的元素换到了第一位。
之后就不管它了,++ 从后面的元素中再找出最小的换到第一位。
public static void main(String[] args) {
int[] arr = { 9,8,7,6,5,4,3,2,1,0 };
int temp = 0;
for(int i = 0; i < arr.length - 1; i ++) {
int min = i; //假设i下标的元素是最小元素,这里先把第一个元素假设为最小元素
//min是数组下标
for(int j = i + 1; j < arr.length; j ++) {
//从第二个也就是i+1个元素开始找更小的元素
if(arr[j] < arr[min]) //一旦发现第j个元素比假设的这个最小元素还小
min = j; //就把最小元素下标赋值给min
}
//确保把真正最小的元素和数组第一个元素交换(后面就是和第2,3,4...个元素交换用i++控制)
temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
for(int i = 0; i < arr.length; i ++)
System.out.print(arr[i] + " ");
}