通俗易懂讲解 [图解]选择排序

451 阅读3分钟

1.选择排序

从数组中选择最小元素,将它与数组的第一个元素交换位置。再从数组剩下的元素中选择出最小的元素,将它与数组的第二个元素交换位置。不断进行这样的操作,直到将整个数组排序。

选择排序需要 ~N2/2 次比较和 ~N 次交换,它的运行时间与输入无关,这个特点使得它对一个已经排序的数组也需要这么多的比较和交换操作。

2. 图示过程

在这里插入图片描述

3.动图展示

在这里插入图片描述

4.约定

待排序的元素需要实现 Java 的 Comparable 接口,该接口有 compareTo() 方法,可以用它来判断两个元素的大小关系。

使用辅助函数 less() 和 swap() 来进行比较和交换的操作,使得代码的可读性和可移植性更好。

排序算法的成本模型是比较和交换的次数。

package 算法.排序;/*
作者     :XiangLin
创建时间 :15/05/2020 17:17
文件     :Sort.java
IDE      :IntelliJ IDEA
*/

public abstract class Sort<T extends Comparable<T>>{
    public abstract void sort(T[] nums);

    protected boolean less(T v, T w){
        return v.compareTo(w) < 0;
    }

    protected void swap(T[] a,int i ,int j){
        T t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
}

5.过程

第1趟比较:拿第1个元素依次和它后面的每个元素进行比较,如果第1个元素大于后面某个元素,交换它们,经过第1趟比较,数组中最小的元素被选出,它被排在第一位

第2趟比较:拿第2个元素依次和它后面的每个元素进行比较,如果第2个元素大于后面某个元素,交换它们,经过第2趟比较,数组中第2小的元素被选出,它被排在第二位 ......

第n-1趟比较:第n-1个元素和第n个元素作比较,如果第n-1个元素大于第n个元素,交换它们

6.代码

package 算法.排序;/*
作者     :XiangLin
创建时间 :15/05/2020 17:41
文件     :Selection.java
IDE      :IntelliJ IDEA
*/

public class Selection <T extends Comparable<T>> extends Sort<T> {
    @Override
    public void sort(T[] nums) {
        int N = nums.length;
        for (int i = 0; i < N - 1; i ++){
            int min = i;
            for (int j = i + 1; j < N; j++){
                if (less(nums[j],nums[min])){
                    min = j;
                }
            }
            swap(nums,i,min);
        }

    }

    public static void main(String[] args) {
        Integer[] nums = {52,63,14,59,68,35,8,67,45,99};
        System.out.println("原数组:");
        for(int i :nums){
            System.out.print(i+" ");
        }
        System.out.println();
        Selection s = new Selection();
        s.sort(nums);

        System.out.println("排序后:");
        for(int i :nums){
            System.out.print(i+" ");
        }
    }
}

在这里插入图片描述

另外博主收藏这些年来看过或者听过的一些不错的常用的上千本书籍,没准你想找的书就在这里呢,包含了互联网行业大多数书籍和面试经验题目等等。有人工智能系列(常用深度学习框架TensorFlow、pytorch、keras。NLP、机器学习,深度学习等等),大数据系列(Spark,Hadoop,Scala,kafka等),程序员必修系列(C、C++、java、数据结构、linux,设计模式、数据库等等)以下是部分截图

更多文章见本原创微信公众号「五角钱的程序员」,我们一起成长,一起学习。一直纯真着,善良着,温情地热爱生活。关注回复【电子书】即可领取哦

在这里插入图片描述

在这里插入图片描述

所有巧合的是要么是上天注定要么是一个人偷偷的在努力。

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

1、给俺点个赞呗,可以让更多的人看到这篇文章,谢谢各位亲。

2、亲们,关注我的原创微信公众号「五角钱的程序员」,我们一起成长,一起学习。一直纯真着,善良着,温情地热爱生活。关注回复【电子书】有很多资源哦。

给大家推荐一个Github,上面非常非常多的干货:github.com/XiangLinPro…

Raise your words, not your voice. It is rain that makes the flowers grow, not thunder. 言贵于思,而非其声。恰似万钧雷霆,不敌十里甘霖。

2020.5.15于城口