三、选择排序

选择排序定义:
首先,找到数组中最小的那个元素,其次,将它和数组的第
一个元素交换位置(如果第一个元素就是最小元素那么就跳过)。再次,在剩下的元素中
找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法
叫做选择排序,因为它在不断地选择剩余元素之中的最小者

  原理是如此简单,但是为了更好的理解这个算法,我还是画了一张图帮助理解。


选择排序图解

话不多说上代码:

//选择排序主函数
 public static void sort(Comparable[] a) {
        int N = a.length;
        for (int i = 0; i < N; i++) {
            int minIndex = i;//定义最小的下标默认为i
            for (int j = i + 1; j < N; j++)
                if (less(a[j], a[minIndex])) minIndex = j;//找出最小的下标
            if (minIndex != i)//如果不是第i位,就互换位置
                exch(a, i, minIndex);
        }
    }

    /**
     * 左边的数字比右边的小吗?
     *
     * @param v
     * @param w
     * @return
     */
    private static boolean less(Comparable v, Comparable w) {
        return v.compareTo(w) < 0;
    }

    /**
     * 交换数组两个元素
     *
     * @param a 数组
     * @param i 要交换的数组下标
     * @param j 要交换的数组下标
     */
    private static void exch(Comparable[] a, int i, int j) {
        Comparable t = a[i];
        a[i] = a[j];
        a[j] = t;
    }

   /**
     * 打印数组
     *
     * @param a
     */
    private static void show(Comparable[] a) {
        for (int i = 0; i < a.length; i++)
            System.out.print(a[i] + " ");
        System.out.println();
    }

    //测试
    public static void main(String[] args) {
        Comparable[] arr = {-4, 9, 8, 43, 12, 65, 89, 12, 31, 65, -1, -5, -8};
        sort(arr);
        show(arr);
    }

运行结果为:


运行结果

  大功告成!

  对于长度为 N 的数组,选择排序需要大约 N²/2 次比较和 N 次交换。

  总的来说,选择排序是一种很容易理解和实现的简单排序算法,它有两个很鲜明的特点。
  1.运行时间和数据的初始排列顺序无关。为了找出最小的元素而扫描一遍数组并不能为下一遍扫描提供什么信息。这种性质在某些情况下是缺点,因为使用选择排序的人可能会惊讶地发现,一个已经有序的数组或是主键全部相等的数组和一个元素随机排列的数组所用的排序时间竟然一样长!我们将会看到,其他算法会更善于利用数据的初始状态。
  2.数据移动是最少的。每次交换都会改变两个数组元素的值,因此选择排序用了 N 次交换——交换次数和数组的大小是线性关系。我们将研究的其他任何算法都不具备这个特征(大部分的增长数量级都是线性对数或是平方级别)。

  整理各大排序算法之后,我会单独整理一份不同排序算法的区别以及应用场景。


  本系列所有的代码都会在github同步更新,立刻前往

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 初级排序算法 排序算法关注的主要是重新排列数组元素,其中每个元素都有一个主键。排序算法是将所有元素主键按某种方...
    深度沉迷学习阅读 5,324评论 0 1
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,585评论 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 5,017评论 0 2
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 11,347评论 0 13
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    printf200阅读 4,134评论 0 0