选择排序
- 选择排序可能是最简单的排序吧,就是比较一个一个比较。
- 两层for循环,时间复杂度是O(n平方)
- 最外层循环控制次数,里面循环用于寻找当前最小的
- 找到了之后与第一个进行交换,然后外层循环完成了一个单位
话不多说,上代码!
public class Choose {
public static void main(String[] args) {
int [] arr = {0,1,6,9,8,7,5,3,55,44,6};
for (int i = 0; i < arr.length - 1; i++) {
int min = arr[i]; int index = i;
for (int j = i+1; j < arr.length; j++) {
if(min>arr[j]) {
min = arr[j];
index = j;
}
}
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
分析:
n个数据,进行选择排序,顺序若是从小到大排序。它的核心思想是:每次遍历找出最小的,交换后放在最左边,i++;
两层for循环,外层用来记录已经找了第几次最小的了,里层用来每次找最小的。
优化:
最外层其实遍历n-1次就行,因为倒数第二个最小的出来了,最后一个肯定是最大的,并且可以不用设置变量min,全部用arr[index]替代就行。
拓展:
交换那里,可以不引入temp中间变量,根据算法逻辑:a ,b两个数,交换-> a = a + b;b = a - b;a = a - b; 有这三个式子就完成两个数的交换了,这是典型的时间换空间理念。步骤多了,但是变量少了。
注意事项:
很多新手容易将 int index = i;写成int index = 0;这种写法的问题在于,当连续两个依次最小的时候,比如 3,2,1;第一次确实是找出了1最小,然后和3交换了,变成了1,2,3。但是接下来,2比3小,它便不会进入if(){}这里面,也就是index的值没有改变还是0,那么它交换的时候就是2和1交换了变成了2,1,3。这很明显是错误的。也就是说index是个变动的,它指的就是最小值的角标,而不是固定的某一个数,也就是说他要上下统一,随时都有可能会变动,不能固定赋值。
ok完了