选择排序(Selection sort)是一种简单直观的[排序算法]它的工作原理是每一次从待排序的[数据元素]中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
选择排序输出的是原序列的一个重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*
假设分别有4号小球,8号小球,1号小球,5号小球,9号小球,7号小球,使用选择排序对它们进行升序排序
其中心思想是,假设有n个数:
第1次,遍历所有数,将最小的数放在首位;
第2次,遍历2-n位置的所有数,将最小的数字放在第2位;
第3次,遍历3-n位置的所有数,将最小的数字放在第2位;
......
第n-1次,将n和n-1俩个位置上,小的数放在n-1位置上
初始顺序: 4,8,1,5,9,7
第一次排序:4和8进行对比,1,5,9,7
第二次排序:4再和1比 其它数据不变
1,8,4,5,9,7
第三次排序:4再和5比 其它数据不变
1,8,4,5,9,7
第四次排序:4再和9比 其它数据不变
1,8,4,5,9,7
......
当4和除了自己之外的所有数据比较完成了之后,
接着第二的数据就开始对除了小于或者等于自己索引的数据之外的数据进行比较
以此类推...
时间复杂度 O(N^2)
(稳定)
private static void chooseSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
int least = i; //选取当前的遍历到的数
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[least]) { //循环找到本轮最小的数
least = j;
}
}
//在内层循环结束,也就是找到本轮循环的最小的数以后,再进行交换
if(i != least){ //交换a[i]和a[least]
int temp = arr[i];
arr[i] = arr[least];
arr[least] = temp;
}
}
}
{\__/} {\__/}
( ·-·) (·-· )
/ >------------------------------------------------< \
| ☆ |
| ☆ |
| ★ |
| ☆ |
| ☆ |
| |
-------------------------------------
如有兴趣可以关注我的公众号: