【Algorithm】选择排序法

简单的选择排序法思想:

* 首先找到数组中最小的元素,将它和数组第一个元素互换位置(如果第一个元素就是最小那么它就和自己交换)。
* 其次,在剩下的元素中找到最小的元素,将它与数组的第二个元素互换位置。如此往复。
* 即,它不断地选择剩余元素中的最小者。

Java 示例代码如下:

public class Selection {

    public static void main(String[] args) {
        int[] a = {11, 32, 49, 6, 91, 2, 15, 70, 19, 8};
        System.out.println("排序之前:");
        for (int i=0; i<a.length; i++) { //a.length = 10
            System.out.print(a[i] + " ");
        }
        
        // 简单的选择排序
        for (int i=0; i<a.length; i++) {
            int min = a[i]; //最小值
            int n = i; //最小值的索引
            for (int j=i+1; j<a.length; j++) {
                if (a[j] < min) { //找出最小的数
                    min = a[j];
                    n = j;
                }
            }
            a[n] = a[i];
            a[i] = min;
        }
        
        System.out.println();
        System.out.println("排序之后:");
        for (int i=0; i<a.length; i++) {
            System.out.print(a[i] + " ");
        }
    }
    
}

选择排序法特点:

1. 运行时间和输入无关。

  为了找出最小的元素而扫描一遍数组并不能为下一次扫描提供什么信息(在某种情况下是缺点)。

  【PS: 一个已经有序的数组和一个元素随机排列的数组所用的排序时间一样长!】

2. 数据移动是最少的。

  用了 N 次交换。

参考:

《算法》

各种排序算法的分析及java实现

此外,还有一个小动画解释的很生动,推荐下:

http://visualgo.net/sorting.html

原文地址:https://www.cnblogs.com/jaxer/p/5326810.html