排序算法应该是平时经常要用到的算法,也是非常重要需要掌握的初级技能,之前一直觉得很迷糊,所以重头再看一遍的时候才发现原理原来是这样的,一下子就清楚了很多。

定义

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
关于最后的不稳定的说明
稳定:如果 a 原本在 b 前面,而 a=b,排序之后 a 仍然在 b 的前面。
不稳定:如果 a 原本在 b 的前面,而 a=b,排序之后 a 可能会出现在 b 的后面。

其实选择排序最好的理解方法就是从名字入手,从数据元素中选择出最小的一个排在第一位,然后再从剩下的数据中选出再最小的一个放在前面,依次下来整个集合就是有序的了。

图解过程

这边我取长度为4的int数组,做最简单的图解描述

android 几个数字排序 安卓排序算法_排序算法


第一趟:遍历所有的数据,找到最小的值,放到最前面,并且相互交换位置

第二趟:遍历剩下的元素,找到最小值,再次交换位置

第三趟:还是遍历剩下的元素,找到最小值,这里的例子中已经符合顺序了,随意不再交换

所以选择排序的原理就很简单了,一个长度为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]

小结

选择排序的简单运用本质上其实就是遍历数组,将符合规则的元素放到自己想要的位置,明白了原理就很简单。