【算法学习】三 选择排序分析

前言

社长,一个爱学习,爱分享的程序猿,始终相信,付出总会有回报的。知识改变命运,学习成就未来。爱拼才会赢!
程序猿学社的GitHub,已整理成相关技术专刊,欢迎Star:
https://github.com/ITfqyd/cxyxs

作为一个有梦想的程序猿,建议大家还是花时间深入的学习一下算法,不要觉得我项目开发过程中,很少用到,学不学没什么必要,java为什么能迅速的被广大的人们接受,我想大家都知道是什么原因,其中有一个重要的原因就是垃圾回收,你现在还觉得算法不重要吗?

学习算法的朋友,开始上车了,老司机社长带领你们一起领略一下算法之美。

 


剧情:
面试官隔壁小王:看你简历,有几年工作经历了,说说什么是选择排序?
社长:不知道,我知道什么是冒泡排序
面试官隔壁小王:那你回去等通知把。

 

 

一. 什么是选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

二. 选择排序的算法逻辑是怎么样实现的?

1.先从第一个元素开始,相邻的两个元素进行比较,最后得出第一次比较中最小的元素;
2.记录好这个最小元素的位置,并把这个元素与第一个元素互换位置;
3.接着再从第二个元素开始,当前位置元素和最小位置元素再进行比较,得出第二次比较中最小的元素;
4.记录好这个最小元素的位置,并把这个元素与第小位置元素互换位置;

话不多说,开始
有5位选手4,10,9,8,1

 


上次开展了通过冒泡排序赛制的方式,进行第一届拳王争霸大赛,有观众反馈,赛制有点复杂。现在第二届,世界拳王争霸赛,赛制有了更新。让我一起来了解一下最近的赛制是怎么样的。

 

这次采用淘汰制的方式,选出top1 top2 top3
淘汰赛第一轮:

 


先选一个擂主。默认他是最菜的(本轮才生效,临时变量)。嘻嘻
第一场:
4V10 4小,不用换位置,并记录他的下标是0
第二场:
4V9 4小,不用换位置,并记录他的下标是0
第三场:
4V8 4小,不用换位置,并记录他的下标是0
第四场:
4V1 1小,记录他的下标是4,0和4对应的选手换位子

 


换位后

 


后面的流程类似,具体的交换流程如下

绿色标识需要交换位置的两个数

 

三 代码实现

 

package com.fyqd.test;

import java.util.Arrays;

/**
 * Description:
 * Author: wude
 * Date:  2020/1/7 10:39
 * Modified By:
 */
public class SelectSortTest {
    public static void main(String[] args) {
        int[] arrs = {4,10,9,8,1};
        selectionSort(arrs);
        for (int i=0;i<arrs.length;i++){
            System.out.println(arrs[i]);
        }
    }

    public static void selectionSort(int[] arr){
        for (int i = 0; i < arr.length - 1; i++) {
            int  min = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[min] > arr[j]) {
                    min = j;
                }
            }
            if (min != i) {
                int tmp = arr[min];
                arr[min] = arr[i];
                arr[i] = tmp;
            }
            System.out.println(Arrays.toString(arr));
        }

    }
}

四、算法性能

4,10,9,8,1比较了4轮
第一轮4次 第二轮3次 第三轮2次 第四轮1次
时间复杂度
选择排序的交换操作介于 0 和 (n - 1) 次之间。选择排序的比较操作为 n (n - 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。
选择排序算法的时间复杂度是O(n*n),空间复杂度为1,这个算法的执行效率当n相对小的时候,效率比较快,但是n一旦扩大,效率将会下降明显。
稳定性:
排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同,相同则说明是稳定的排序算法(关于稳定性,数据与结构数上,差不多就是这样描述的)。是不是有点懵,我之前也是这样的反应,正常。通过一个例子我们来了解一下稳定性。

5,8,5,2,9选择排序第一次会选择出一个最小的5,索引为0的5和2进行了交换。通过排序,索引为0的5,跑到索引为2的5后面。很明显就不符合排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。所以我们说选择排序是不稳定的排序方式

 


上一章,社长给大家聊了聊冒泡排序,我们来进行每日一总结,总结一下冒泡排序和选择排序的区别。
区别:
一般来说选择排序效率比较高,因为只要交换一次,冒泡排序是稳定的,选择排序是不稳定的。

 

博主java小白,浅谈一下自己的个人理解,有问题之处,欢迎指正。觉得不错的,点赞评论支持一下。后续,我会一直分享java算法方面的文章,跟社长一起领略算法的魅力。

后记

程序猿学社的GitHub,欢迎Star:
https://github.com/ITfqyd/cxyxs
觉得有用,可以点赞,关注,评论,留言四连发。

 

©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值