原理:

  • 首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)
  • 其次,在剩下的元素中找到最小的元素,将它和数组的第二个元素交换位置。如此往复,直到将整个数组排序交换元素的代码写在内循环中,每次交换都能排定一个元素,因此交换的总次数是N。所以算法的时间效率取决于比较的次数。

特点:

运行时间与输入无关。为了找出最小的元素而扫描一遍数组并不能为下一遍扫描提供什么信息,即便一个已经有序的数组和一个随机排列的数组所用的排序时间也是一样的。数据移动是最少的。每次交换都会改变两个元素的值,因此选择排序用了 N 次交换。

代码实现

public static void sort(int[] a) {
        // 将 a[] 按升序排列
        int len = a.length;
        for (int i = 0; i < len; i++) {
            int min = i;
            for (int j = i + 1; j < len; j++) {
                if (a[min] > a[j]) {
                    a[min] = a[min] ^ a[j]; // 进行交换
                    a[j] = a[min] ^ a[j];
                    a[min] = a[min] ^ a[j];
                }
            }
        }
    }
复制代码

测试

public static void main(String[] args) {
        int[] a = {5,2,3,1,4,6,10};
        sort(a);
        for(int i = 0;i < a.length;i++){
            System.out.print(a[i] + " ");
        }
    }
复制代码

排序效果