选择排序算法的实现和优化

news2024/9/25 17:15:04

初识选择排序:

算法思想[以升序为例]:

第一趟选择排序时,从第一个记录开始,通过n-1次关键字的比较,从第n个记录中选出关键字最小的记录,并和第一个记录进行交换

第二趟选择排序时,从第二个记录开始,通过n-2次关键字的比较,从第n-1个记录中选出关键字最小的记录,并和第二个记录进行交换

第i趟选择排序时,从第i个记录开始,通过n-i次关键字的比较,从n-i+1个记录中选择出关键字最小的记录,并和第i个记录进行交换

反复进行上述步骤,经过n-1趟选择排序,将把n-1个记录排到位,最后剩下的那个元素同样已经就位,所以共需进行n-1趟选择排序

文字描述[以升序为例]:

将数组分为两个子集,排序的和未排序的,每一轮从未排序的子集中选出最小的元素,放入排序子集,重复上述步骤,直至整个数组有序

算法实现:

代码如下:

package bin_find;
import java.util.Arrays;

public class selectionSort {
    public static void main(String[] args) {
        int[] a={5,3,7,2,1,9,8,4};
        selection(a);
    }

    private static void selection(int[] a){
        for(int i=0;i<a.length-1;i++) {//n个元素参与排序,需要进行n-1次
            for (int j = i + 1; j < a.length; j++) {//每轮i+1---a.length个元素之间相比较
                if (a[i] > a[j]) {//前者大于后者,则进行交换
                    swap(a, i, j);
                }
            }
            System.out.println("第"+(i+1)+"轮选择排序的结果"+Arrays.toString(a));
        }
    }
    public static void swap(int arr[],int i,int j){
        int t=arr[i];
        arr[i]=arr[j];
        arr[j]=t;
    }
}

输出如下:

1轮选择排序的结果[1, 5, 7, 3, 2, 9, 8, 4]2轮选择排序的结果[1, 2, 7, 5, 3, 9, 8, 4]3轮选择排序的结果[1, 2, 3, 7, 5, 9, 8, 4]4轮选择排序的结果[1, 2, 3, 4, 7, 9, 8, 5]5轮选择排序的结果[1, 2, 3, 4, 5, 9, 8, 7]6轮选择排序的结果[1, 2, 3, 4, 5, 7, 9, 8]7轮选择排序的结果[1, 2, 3, 4, 5, 7, 8, 9]

优化后的算法实现:

优化思路

减少交换次数,每一轮可以先找到最小的索引,再每轮最后再交换元素

代码如下:

package bin_find;
import java.util.Arrays;

public class selectionSort {
    public static void main(String[] args) {
        int[] a={5,3,7,2,1,9,8,4};
        selection(a);
    }

    private static void selection(int[] a){
        //代表每轮选择最小元素要交换到的目标索引
        for(int i=0;i<a.length-1;i++) {

            int s = i;//代表最小元素的索引[这里是升序]---第一次最小元素的索引为1,第二次最小元素的索引为2.....

            //从当前最小元素的下一位元素开始直到最后一个元素---完成一次选择排序
            for (int j = s + 1; j < a.length; j++) {
                //[这里是升序],前者大于后者,则将更小数的索引值赋值给s,因为变量s本身代表的含义为最小元素的索引
                if (a[s] > a[j]) {
                    s = j;
                }
            }
            if (s != i) {//若不是同一个数,则进行交换
                swap(a, s, i);
            }
            System.out.println("第"+(i+1)+"轮选择排序的结果"+Arrays.toString(a));
        }
    }
    public static void swap(int arr[],int i,int j){
        int t=arr[i];
        arr[i]=arr[j];
        arr[j]=t;
    }
}

输出:

1轮选择排序的结果[1, 3, 7, 2, 5, 9, 8, 4]2轮选择排序的结果[1, 2, 7, 3, 5, 9, 8, 4]3轮选择排序的结果[1, 2, 3, 7, 5, 9, 8, 4]4轮选择排序的结果[1, 2, 3, 4, 5, 9, 8, 7]5轮选择排序的结果[1, 2, 3, 4, 5, 9, 8, 7]6轮选择排序的结果[1, 2, 3, 4, 5, 7, 8, 9]7轮选择排序的结果[1, 2, 3, 4, 5, 7, 8, 9]

未进行优化的算法输出;

在这里插入图片描述

进行优化的算法输出:

在这里插入图片描述

通过比较二者的输出结果,我们能够很明显的感觉到,经过优化后的算法在实现的过程中,数据之间的交换次数明显减少

选择排序 VS 冒泡排序:

1:二者的平均复杂度都是O(n^2),但是当有序数组使用冒泡排序时,其时间复杂度为O(n)

2:选择排序一般要快于冒泡排序,因为其交换的次数少

3:但如果集合有序度高,那么冒泡排序优先于选择排序

例:在上篇文章的冒泡排序优化算法中,我们通过设置变量,去判断当前的数组元素是否发生交换,如果未发生交换,则证明当前数组已经有序,不再进行排序

4:冒泡排序属于稳定排序算法,而选择属于不稳定排序

稳定 VS 不稳定:即为两个大小相等的数,在参与排序之前具有先后关系,若排序完成,这两个数的先后顺序并未发生改变,那么即为稳定排序,否则为不稳定排序

举例:

(3,3,2)

对于上述数组:

参与冒泡排序:

第一轮:3和3相等,无需交换位置,3和2交换位置
第二轮:3和2交换位置
排序结束,排序后的结果为(2,3,3)

参与选择排序:

第一轮:将3取出,与3比较,3不满足大于3,再与2进行比较,满足大于2,交换位置
第二轮:将3取出,与3进行比较,不满足大于3
排序结束,排序成功,排序后的结果为(2,3,3)

通过两种方法的排序结果,我们不难看出通过冒泡排序算法,两个大小相等的数的先后关系并没有发生改变,即为稳定的排序,而通过选择排序算法,两个大小相等的数的先后关系发生了改变,即为不稳定的排序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux学习笔记【part1】目录结构与VIM文本编辑器

Linux基础篇学习笔记 1.CentOS 7 64位安装 第一步&#xff0c;在软件选择中可以设置图形界面。 第二步&#xff0c;手动分区中设置挂载点&#xff0c;分别为引导分区、通用分区和交换区。 第三步&#xff0c;设置内核崩溃转储机制&#xff0c;这对服务器来说非常有用。 第四步…

传输层协议:TCP与UDP协议的区别

TCP和UDP有哪些区别&#xff1f; 关于TCP与UDP协议两个协议的区别&#xff0c;大部分人会回答&#xff0c;TCP是面向连接的&#xff0c;UDP是面向无连接的。 什么叫面向连接&#xff0c;什么叫无连接呢&#xff1f;在互通之前&#xff0c;面向连接的协议会先建立连接。例如&a…

网络工程师备考7章

考点分布: 注:考点不多,这个重点记住即可; 7.1 IPV4的问题与改进 7.2 IPV6的报文格式 注:版本0110表示IPV6,源地址和目的地址都是128位(bit),整个头部固定40个B(字节) 注:通信类型和流标记实际上是没有用的。负载长度是实际的报文长度,下一个头部:IPV6是可以作…

297. 二叉树的序列化与反序列化

297. 二叉树的序列化与反序列化 难度困难 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;采取相反方式重构得到原数据。 请设计一个…

Linux:查看服务器信息,CPU、内存、系统版本、内核版本等

还是最近工作的总结&#xff0c;性能验证要根据服务器的配置才能做进一步的结论论证&#xff0c;废话不多说 目录查看Linux内核版本查看Linux系统版本CPU查看CPU信息&#xff08;型号&#xff09;物理CPU个数每个物理CPU中core的个数(即核数)查看逻辑CPU的个数内存查看内存信息…

【C语言航路】第十三站:动态内存管理

目录 一、为什么存在动态内存分配 二、动态内存函数 1.内存的分区 2.malloc和free &#xff08;1&#xff09;malloc和free库函数文档 &#xff08;2&#xff09;malloc和free的使用 2.calloc &#xff08;1&#xff09;calloc的库函数文档 &#xff08;2&#xff09;c…

模糊图像检测(c++)

Opencv-模糊检测 - 知乎图像清晰度&#xff0c;是指影像上各细部影纹及其边界的清晰程度。 解决问题&#xff1a;由于前端摄像机视频中聚焦不当&#xff0c;异物遮挡等原因&#xff0c;所引起的画面视野图像模糊的现象。 算法原理&#xff1a;将彩色图像转化为灰度图像&#xf…

Python深度学习基础(九)——深入浅析卷积核

深入浅析卷积核引言单通道卷积简单图像边缘检测锐化高斯滤波引言 提到卷积&#xff0c;应该多数人都会想到类似上图的这种示例&#xff0c;可以简单的理解成卷积核与图像中和卷积核相同大小的一块区域与卷积核相乘再求和&#xff0c;通过移动区域产生一个有和组成的新的图像&am…

黑马学ElasticSearch(十二)

目录&#xff1a; &#xff08;1&#xff09;ES集群-集群结构介绍 &#xff08;2&#xff09;es集群-搭建集群 &#xff08;3&#xff09;es集群-集群职责及脑裂 &#xff08;4&#xff09;es集群-分布式新增和查询流程 &#xff08;5&#xff09; es集群-故障转移 &#…

传输层协议:TCP协议(下)——运作方式(如何三次握手、四次挥手等)

运作方式 TCP协议的运行可划分为三个阶段&#xff1a;连接创建(connection establishment)、数据传送&#xff08;data transfer&#xff09;和连接终止&#xff08;connection termination&#xff09;。操作系统将TCP连接抽象为套接字表示的本地端点&#xff08;local end-p…

【PyTorch】教程:学习基础知识-(6) Autograd

AUTOMATIC DIFFERENTIATION WITH torch.autograd 在训练神经网络时&#xff0c;最常用的算法是反向传播算法&#xff0c;在该算法中&#xff0c;参数根据损失函数相对于给定参数的梯度进行调整。 为了计算这些梯度&#xff0c; PyTorch 有一个内置的微分引擎 torch.autograd …

2022秋招算法岗面经题:训练模型时loss除以10和学习率除以10真的等价吗(SGD等价,Adam不等价)

问题描述&#xff1a;训练深度学习模型时loss除以10和学习率除以10等价吗&#xff1f; 先说结论 这个问题的答案与优化器有关 使用Adam、Adagrad、RMSprop等带有二阶动量vtv_tvt​的优化器训练时&#xff0c;当我们将loss除以10&#xff0c;对训练几乎没有影响。使用SGD、Mo…

Streamlit自定义组件开发教程

在这篇文章中&#xff0c;我们将学习如何构建Streamlit组件以及如何发布streamlit组件供其他人使用。 使用 3D场景编辑器快速搭建三维数字孪生场景 1、什么是Streamlit组件&#xff1f; Streamlit 组件是一个可共享的 Streamlit 插件&#xff0c;可让你为应用程序添加新的视觉…

Java——子集

题目链接 leetcode在线oj题——子集 题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 题目示例 输入&#xff1a;nums [1,2,3] …

MySQL管理

1&#xff1a;MySQL管理1.1&#xff1a;系统数据库Mysql数据库安装完成后&#xff0c;自带了一下四个数据库&#xff0c;具体作用如下&#xff1a; 数据库 含义 mysql 存储MySQL服务器正常运行所需要的各种信息 &#xff08;时区、主从、用 户、权限等&#xff09; information…

性能测试/实战演示 H5 性能分析

W3C标准是浏览器标准&#xff0c;一般浏览器都支持W3C标准&#xff0c;它规定使用者可以通过api查询性能信息&#xff0c;可借用W3C协议完成自动化H5性能测试。 W3C官网&#xff1a;Navigation Timing 使用chrome浏览器对webview进行手工查看&#xff0c;伴随着业务增多&#x…

mysql:索引的数据结构,B树,B+树浅聊

mysql&#xff1a;索引的数据结构 什么是索引&#xff1f; 索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构 为什么学索引&#xff1f; 之前应该有概念说&#xff0c;把索引理解为目录&#xff0c;比如通过s就可以查询到s开头的汉子从哪也开始&#xff…

[网鼎杯 2020 青龙组]AreUSerialz

目录 信息收集 代码审计 前提知识 思路分析 绕过检测 方法一 poc payload 方法二 poc payload 信息收集 进入页面给出了源代码如下&#xff0c;是一道PHP的反序列化题目 <?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {pro…

Linux多线程 线程概念 | 线程VS进程 | 线程控制【万字精讲】

线程 一、线程概念 1. 知识支持及回顾 在我们一开始学习进程的时候。我们总说进程在内部执行时&#xff0c;是OS操作系统调度的基本单位。其实并不严谨&#xff0c;今天&#xff0c;我们要重新完善这个说法——线程在进程内部运行&#xff0c;线程是OS操作系统调度的基本单位…

WorkPlus移动办公平台,助力企业随时随地“指尖办公”

近年来&#xff0c;随着移动互联网的发展&#xff0c;越来越多的人习惯于随时随地通过移动设备完成工作、购物、游戏等。移动办公应用就是基于移动终端的信息化办公应用&#xff0c;利用企微、钉钉、WorkPlus等移动办公平台&#xff0c;实现企业与员工间的随时随地工作、沟通&a…