排序-选择排序

570 阅读1分钟

1. 选择排序的定义

找出数组最小的元素跟左边第一个元素位置进行交换。然后再从剩下的数组元素中找出最小的位置,跟左边第二个元素位置进行交换。 如此反复,直到将整个数组排序。 执行轨迹如下:

array: [2, 1, 6, 8, 3]

第1次执行:minPosition = 0遍历选择后的结果[1, 2, 6, 8, 3]

第2次执行:minPosition = 1遍历选择后的结果[1, 2, 6, 8, 3]

第3次执行:minPosition = 3遍历选择后的结果[1, 2, 3, 8, 6]

...

第n次执行:minPosition = n-1遍历选择后的结果[1, 2, 3, 6, 8]

2. 代码实现


public class Selection extends SortBase {

    public static void main(String[] args) {
        Comparable[] a = new Comparable[] {2, 1, 6, 8, 3};
        sort(a);

        System.out.print("排序结果:");
        show(a);

        showLessAndExchCount(a);
    }

    public static void sort(Comparable[] a) {

        for (int i = 0; i < a.length; i++) {
            int min = i;
            for (int j = i + 1; j < a.length; j++) {
                if (less(a[j], a[min])) {
                    min = j;
                }
            }
            exch(a, i, min);
            System.out.print("第"+(i+1)+"次选择排序后:");
            show(a);
        }

    }

}

运行结果如下:

第1次选择排序后:1 2 6 8 3 
第2次选择排序后:1 2 6 8 3 
第3次选择排序后:1 2 3 8 6 
第4次选择排序后:1 2 3 6 8 
第5次选择排序后:1 2 3 6 8 
排序结果:1 2 3 6 8 
排序元素个数:5, 比较次数:10, 交换次数:5

3. tradeoff

  1. 运行时间跟输入的数组元素无关
  2. 移动数据最少

4. 复杂的分析

  1. 比较次数是n^2/2
  2. 交换次数是n