选择排序(SelectSort)

1 选择排序

选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序与冒泡排序非常的相似,都是一层层筑顶的过程,不同点在于冒泡排序会频繁的互换位置,而选择排序只是记录最大元素的位置,并与顶互换,只需交换一次,所以选择排序与冒泡排序相比时间消耗会更少,更有效率,尽管它们最坏的时间复杂度都是O(n^2).

2 稳定性

选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择中,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。例如,序列 5、8、5、2、9,我们知道第一遍选择第 1 个元素 5 和 2 交换,那么原序列中两个 5 的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。

3 排序实例

运用选择排序将数组arr[] = {3, 2, 1, 0, -1 , -2, -3}进行排序,则其排序步骤如下:

  • 初始化:3 2 1 0 -1 -2 -3
  • 第一次:-3 2 1 0 -1 -2 3
  • 第二次:-3 -2 1 0 -1 2 3
  • 第三次:-3 -2 -1 0 1 2 3.

排序完毕。

4 Java代码

public class SelectSort {      
    public static void main(String[] args) {
        int[] arr = {3, 2, 1, 0, -1, -2, -3};
        System.out.println("Before sort:");
        printArray(arr);
        selectSort(arr);
        System.out.println("After sort:");
        printArray(arr);
    }

    private static void selectSort(int[] arr) {
        // 判断数组是否为空或者数组元素个数为 1
        if (arr == null || arr.length < 2) {
            return;
        }
        for (int i = arr.length - 1; i > 0; i--) {
            // 假设 i 是最大元素的下角标
            int maxIndex = i;
            // 依次将前 i-1 个元素同第 i 个元素相比较
            for (int j = i - 1; j >= 0; j--) {
                if (arr[j] > arr[maxIndex]) {
                    maxIndex = j;
                }
            }
            // 如果最大元素的下角标不等于 i,则将其进行交换
            if (maxIndex != i) {
                int temp = arr[i];
                arr[i] = arr[maxIndex];
                arr[maxIndex] = temp;
            }
        }
    }

    /**
     * 打印数组
     *
     * @param arr
     */
    private static void printArray(int[] arr) {
        System.out.print("{");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
            if (i < arr.length - 1) {
                System.out.print(", ");
            }
        }
        System.out.println("}");
    }
}  

你可能感兴趣的:(设计模式及算法)