排序算法应该是平时经常要用到的算法,也是非常重要需要掌握的初级技能,之前一直觉得很迷糊,所以重头再看一遍的时候才发现原理原来是这样的,一下子就清楚了很多。
定义
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
关于最后的不稳定的说明
稳定:如果 a 原本在 b 前面,而 a=b,排序之后 a 仍然在 b 的前面。
不稳定:如果 a 原本在 b 的前面,而 a=b,排序之后 a 可能会出现在 b 的后面。
其实选择排序最好的理解方法就是从名字入手,从数据元素中选择出最小的一个排在第一位,然后再从剩下的数据中选出再最小的一个放在前面,依次下来整个集合就是有序的了。
图解过程
这边我取长度为4的int数组,做最简单的图解描述
第一趟:遍历所有的数据,找到最小的值,放到最前面,并且相互交换位置
第二趟:遍历剩下的元素,找到最小值,再次交换位置
第三趟:还是遍历剩下的元素,找到最小值,这里的例子中已经符合顺序了,随意不再交换
所以选择排序的原理就很简单了,一个长度为n的数组,不断的遍历找到最小值,依次按照一定的排序规则排序,最后得到的就是我们想要的数组了。
按照上面的图解,实际上,数组长度为n的数组,依次遍历的次数为n, n-1, n-2, n-3, n-4…1,所以选择排序的复杂度是O(n^2)。
代码实现
我这边将一个乱序的int数组从小到大的顺序进行选择排序
public class OrderSortTest {
public static void main(String args[]) {
//数据源
int[] array = {3, 45,34,34,67,23,12,22,2, 10,25,77,89,100,78};
//遍历数组
for(int i = 0 ; i < array.length - 1; i++) {
int index;
for(int j = i + 1; j < array.length; j++) {
//如果后面的数据小于前面的数据就交换值
if(array[i] > array[j]) {
index = array[j];
array[j] = array[i];
array[i] = index;
}
}
}
System.out.println("array = " + Arrays.toString(array));
}
}
结果: array = [2, 3, 10, 12, 22, 23, 25, 34, 34, 45, 67, 77, 78, 89, 100]
小结
选择排序的简单运用本质上其实就是遍历数组,将符合规则的元素放到自己想要的位置,明白了原理就很简单。