图解选择排序算法及优化

【排序】选择排序(含优化版) 冒泡排序的时间复杂度为O(n^2),其中n是要排序的元素数量。这是因为冒泡排序需要进行多次遍历,每次遍历都需要比较和交换元素。因此,对于大规模数据的排序,冒泡排序可能不是最有效的选择。选择排序的时间复杂度也是O(n^2),但它的性能通常优于冒泡排序。因为选择排序只需要进行一次遍历,并且只需要进行一次比较和交换操作。因此,在处理大规模数据时,选择排序通常更为高效。但如果遇到已经排好序的数据,冒泡排序只需要循环一次就能发现,并终止,但选择排序却需要继续遍历数组,在这一点上选择排序的效率是不如冒泡排序的。 阅读详情

ced485cbb11e458d81a746890b32cf3f.gif

作者:敲代码の流川枫

博客主页:流川枫的博客

专栏:和我一起学java

语录:Stay hungry stay foolish

工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网

点击免费注册和我一起刷题吧    

文章目录

1. 算法思想

2. 算法图解

3. 代码实现

4. 选择排序算法的优化

5. 选择排序特点


 

556b41a70265423492026022f8a28ac6.png

1. 算法思想

1. 找到数组中最大(小)的那个元素

2. 将它和数组的第一个元素交换位置(如果第一个元素就是最大或者最小的元素,那么就和自己交换位置)

3. 在剩下的元素中找到最大(小)的元素,将它与数组的第二个元素交换位置,一直循环,直到整个数组有序

该算法是在不断地选择剩余元素之中最大(小)的元素然后进行排序,因此该算法叫做选择排序

2. 算法图解

以数组array图解选择排序,排序结果为升序

int[] array = {25,33,10,15,70,45};

2ff6cda2526f4aa4ab79796c2bc0f128.png

 假设每个循环开始第一个数是总是最小,minIndex保存最小数的下标i,i范围:从0开始到array.length-1

056d85db906541e78c82629d4039cc1f.png

开始遍历数组,找到最小的数,将索引保存并且交换最小数和当前minIndex所指向的数

9b44579547c644c9a04719e647512861.png

 假设最小数是33,开始向后遍历,找到最小数15,交换4cf0d2ce5fd44c65b85548da1ccc346c.png

7d09b02125b84ef1937a8e898bbac28b.png

 继续循环,25当前是最小,自己和自己交换

7299c8a3e27e46cb9582b960f1c3116e.png

  继续循环,33当前是最小,自己和自己交换

3241b12b3dfb4567918d90dda48fdb32.png

 继续循环,最小数是45,和70交换

964b4e51823c435d9a6ac4755c29bc04.png

fdb0ee8e438f4747b0d21d0ee6bd2ad3.png

  继续循环,70当前是最小,自己和自己交换b3a5e987c8884dd49ace80d84efda6c6.png

至此排序完成

75143ba734f14f3cabf8a35d6db8dad3.png

3. 代码实现

import java.util.Arrays;

public class ChoiceSort{
    public int[] sortArray(int[] nums){
        if(nums.length == 0){
            return nums;
        }
        for (int i = 0; i < nums.length; i++) {
            int minIndex = i;//最小数的下标,每个循环开始总是假设第一个数是最小数
            for (int j = i; j < nums.length; j++) {
                if (nums[j] < nums[minIndex]){//找到最小数
                    minIndex = j;//保存最小数索引
                }
            }
            System.out.println("本轮最小数:"+nums[minIndex]);
            //交换最小数和当前i所指向的元素
            int tmp = nums[minIndex];
            nums[minIndex] = nums[i];
            nums[i] = tmp;
            PrintArray.print(nums);
            System.out.println("————————————————");
        }
        return nums;
    }
    public static void main(String[] args) {
        int[] array = {25,33,10,15,70,45};
        System.out.println("初始数组:");
        PrintArray.print(array);
        ChoiceSort choiceSort = new ChoiceSort();
        choiceSort.sortArray(array);
        System.out.println("排序完成");
        PrintArray.print(array);
    }
}
class PrintArray{
    public static void print(int[] array){
        System.out.println(Arrays.toString(array));
    }
}

结果:

3352c140a09a4cfda67b273ba182ceaa.png

4. 选择排序算法的优化

思路:一般是在一趟遍历中,同时找出最大值与最小值,放到数组两端,这样就能将遍历的趟数减少一半

74671e65796e4c21951915c235f12139.png

遍历数组找到最大值和最小值 , 将最小值放到数组left处,将最大值放到数组right处,然后继续重复操作,直至排序完成

d069e0695a7947799d8bfd181b29b980.png

0754a3f05ab2412e85e841a560544bc9.png

代码: 

import java.util.Arrays;

public class ChoiceSort{
    public int[] sortArray(int[] nums) {
        if (nums.length == 0) {
            return nums;
        }
        /*初始化左端、右端元素索引*/
        int left = 0;
        int right = nums.length - 1;
        while (left < right) {
            /*初始化最小值、最大值元素的索引*/
            int min = left;
            int max = right;
            for (int i = left; i <= right; i++) {
                /*标记每趟比较中最大值和最小值的元素对应的索引min、max*/
                if (nums[i] < nums[min])
                    min = i;
                if (nums[i] > nums[max])
                    max = i;
            }
            /*最大值放在最右端*/
            int temp = nums[max];
            nums[max] = nums[right];
            nums[right] = temp;
            /*此处是先排最大值的位置,所以得考虑最小值(arr[min])在最大位置(right)的情况*/
            if (min == right)
                min = max;
            /*最小值放在最左端*/
            temp = nums[min];
            nums[min] = nums[left];
            nums[left] = temp;
            /*每趟遍历,元素总个数减少2,左右端各减少1,left和right索引分别向内移动1*/
            left++;
            right--;
        }

        return nums;
    }
    public static void main(String[] args) {
        int[] array = {25,33,10,15,70,45};
        System.out.println("初始数组:");
        PrintArray.print(array);
        ChoiceSort choiceSort = new ChoiceSort();
        choiceSort.sortArray(array);
        System.out.println("排序完成");
        PrintArray.print(array);
    }
}
class PrintArray{
    public static void print(int[] array){
        System.out.println(Arrays.toString(array));
    }
}

结果: 

b11891b3bf4e4353a89c1cb8e10fdf57.png

5. 选择排序特点

        待排序序列中,元素个数较少时,适合选用选择排序,时间复杂度为O(n2)
  在选择排序中,每趟都会选出最大元素与最小元素,然后与两端元素交换,此时,待排序序列中如果存在与原来两端元素相等的元素,稳定性就可能被破坏

“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!

ced485cbb11e458d81a746890b32cf3f.gif

 

排序算法(四)选择排序及优化版本 选择排序,是通过每次选择最小的数或者最大的数,然后将它放在它应该出现的位置上。 具体实现过程:将0号下标的数据保存,在之后的数中选择一个最小的数,如果最小的数不是0号数,则将最小的数与0号下标的数进行交换;将1号下标的数进行保存,在之后的数中 选择最小的数,如果最小的数不是1号数,进行交换。以此类推。 下边给出实现代码:void SelectSort(vector<int>& v) { 阅读详情

相关推荐

超全十大经典排序算法及其分析

文章目录0.算法概述0.1 算法分类0.2 算法复杂度0.3 相关概念1. 冒泡排序(Bubble Sort)1.1 算法描述:1.2 图解演示1.3 代码实现1.4 优化过程1.5 性能分析2. 选择排序(Selection Sort)2.1 算法描述:2.2 图解演示2.3 代码实现2.4 优化过程2.5 性能分析2.6 拓展3. 插入排序(Insertion Sort)3.1 算法描述3.2 图解演示3.3 代码演示:3.4 优化过程3.5 性能分析3.6 应用分析4.快速排序(Quick Sort)

Redemption___的博客 1608

选择排序及优化

目录 一、普通实现 二、模板实现 三、优化版本一 四、优化版本二 和冒泡排序区别:冒泡排序是逐步对相邻元素进行操作(比较和交换位置)。而选择排序是从待排序数列中选择最大/小值,再将之放置到已排序数列中。 (有序区,无序区)。在无序区里找一个最小的元素跟在有序区后面。对数组:比较的多,换的少。 选择排序思路: 1、在未排序序列中找到最小(大)元素,...

幻欢子 3197

C 语言_常见排序算法全解析

C 语言常见排序算法全解析

renhl252的专栏 951

十大经典排序算法之选择排序及其优化

一、简单选择排序 1.基本思想: 在长度为N的无序数组中,第一次遍历n-1个数,找到最小的数值与第一个元素交换; 第二次遍历n-2个数,找到最小的数值与第二个元素交换; 。。。 第n-1次遍历,找到最小的数值与第n-1个元素交换,排序完成。 2.过程 3.代码 public static void selectSort(int[] arr) { int minNum = 0; int temp = 0; int a = 0; for (i

Kevinnsm的博客 1220

内部排序算法全动态图解

htmltable {th, td {th {pre {简介:排序是计算机科学中数据处理的基础环节,涉及对无序数据的有序排列。本文针对计算机内存中进行的十大内部排序算法进行了深入解析,并通过动态图解的形式展示了每种算法的工作原理。这些算法包括插入排序、快速排序、归并排序、基数排序、堆排序、计数排序、希尔排序、直接插入排序、冒泡排序和选择排序。每种排序算法都有其特点及适用场景,通过理解它们的工作机制和图解,我们能够更有效地选择和优化排序算法,提升程序性能。

weixin_35390379的博客 1109

STM32驱动AD7779:双极性电源下8通道同步ADC的SPI配置与数据采集实战

本文详细介绍了在双极性电源供电下,使用STM32通过SPI接口驱动AD7779同步ADC芯片实现8通道高精度数据采集的实战经验。重点解析了电源设计、抗干扰处理、寄存器配置、SPI通信技巧及数据校准方法,帮助工程师解决工业测量中的同步采样与噪声控制难题。

e3f4g5的博客 370

【排序】选择排序及其优化

void SelectSort(int* array, int size) { //size-1:每次都会排好一个数据,所以每次都需要进行-1 for (int i = 0; i < size - 1; i++) { //用maxPos标记最大的数据 int maxPos = 0; //size-i:后面数据已经排好序了,...

金金金金金的博客 570

STM32+OOK通讯(OOK发送+OOK接收)+cubemx配置

关于OOK通信,我的理解就是将要发送的信息转换成高低电平(即0和1),然后接收方通过对01进行解码获得信息。于是我用了非常朴素的字符串转二进制+AM调制来完成通信链。话不多说我们直接开始!!!

qq_73856732的博客 2340

选择排序算法java_图解选择排序及算法优化(Java实现)

选择排序前言原理:每次循环对比找出最小/大值,将最值的元素交换至左侧思想:直接选择排序(Straight Select Sort)算法思想:第一趟从n个元素的数据序列中选出关键字最小/大的元素并放在最前/后位置,下一趟从n-1个元素中选出最小/大的元素并放在最前/后位置。以此类推,经过n-1趟完成排序案例分析:1、初始的无序数列 {5,8,6,3,1,7},希望对其升序排序2、按照思路分析:内层循...

weixin_30356837的博客 214

RK3568 OpenHarmony3.2 蓝牙模块AP6275S适配(已更新)

OpenHarmony3.2 Release版默认是适配AP6275s这款蓝牙芯片的,但是打开蓝牙,发现无法扫描到设备、连接设备。目前平台soc为RK3568,根据项目要求,自定义外设。接下来将以解决bug为目的,学习和记录OpenHarmony平台下蓝牙模块的适配流程。RK809 CLK:32.768KHzUART1M1:与蓝牙模块通讯的串口:GPIO4_B6:GPIO4_A5WAKE_GPIO:未定义,硬件拉高1.8V: 未定义,悬空主要是打开串口,/dev/ttyS1,得到文件描述符fd。

Martian_Jonas的博客 2247

【肌电处理】肌电信号EMG积分肌电值+均方根值+中值频率+平均功率频率【含Matlab源码 3386期】

肌电信号EMG积分肌电值+均方根值+中值频率+平均功率频率 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 823

python选择排序算法图解_排序算法(三)冒泡、选择排序的Python实现及算法优化详解...

说在前面最近一年太忙,博客长草了。近日用Python实现了常用排序算法,供大家参考。Java版本排序算法及优化,请看以前的文章。1、排序概念这里不再赘述,请参看前面2篇文章2、简单排序之冒泡法Python实现及优化原理图2.1、基本实现num_list = [[1, 9, 8, 5, 6, 7, 4, 3, 2],[1, 2, 3, 4, 5, 6, 7, 8, 9]]nums = num_lis...

weixin_39707478的博客 182

AI大模型探索之路-训练篇3:大语言模型全景解读

大规模语言模型(Large Language Models,LLM),也称大语言模型或大型语言模型,是一种由包含数百亿以上参数的深度神经网络构建的语言模型,通常使用自监督学习方法通过大量无标注文本进行训练。

寻道AI,探索AI无限可能! 6278

python选择排序算法图解_史上最简单!冒泡、选择排序的Python实现及算法优化详解...

原标题:史上最简单!冒泡、选择排序的Python实现及算法优化详解1、排序概念内部排序和外部排序根据排序过程中,待排序的数据是否全部被放在内存中,分为两大类:内部排序:指的是待排序的数据存放在计算机内存中进行的排序过程;外部排序:指的是排序中要对外存储器进行访问的排序过程。内部排序是排序的基础,在内部排序中,根据排序过程中所依据的原则可以将它们分为5类:插入排序、交换排序、选择排序、归并排序;根据...

weixin_39884270的博客 110

【SAP HANA 46】关于HANA CPU高峰到 80-100%

关于HANA CPU高峰到 80-100%

探索 Java 编程的技巧、最佳实践和解决方案。本博客提供针对 Java 开发者的实用指南,涵盖从基础到高级话题,旨在提升编程效率和技能。 429

TriCore架构-如何将系统刷成HSM

本文介绍了芯片刷写操作流程:首先加载project_Merge.s19文件,进入UCB界面展开BMHD0_ORIG和BMHD1_ORIG。重点说明需要将STAD地址从原始值A0000000修改为0XA00A0000,并详细描述了编辑、更新和写入芯片的步骤。最后提示在HSM刷写过程中如遇错误可能需要输入密码。该操作涉及关键地址修改,需谨慎执行。

xiandang8023的博客 95

JS排序算法

冒泡排序 var ar = [11, 2, 1, 5, 12, 3, 8, 4, 9, 13, 7, 6, 15, 10, 14]; <script> console.log(maopao(ar)); function maopao(arr){ if(arr.length<=1){ return; } var t = 0; ...

Departuretree的博客 133

Ubuntu22.04如何安装cuDNN8.9.7

本文详细介绍了在Ubuntu 22.04系统上为CUDA 12.2安装适配cuDNN 8.9.7的完整流程,特别针对RTX A6000显卡。主要内容包括:1)选择与CUDA 12.2兼容的cuDNN版本;2)使用deb包方式的安装步骤(添加仓库、导入密钥、安装组件);3)通过MNIST示例验证安装;4)版本锁定、卸载旧版等补充说明;5)性能测试方法。文中强调了版本匹配的重要性,并提供了多卡配置建议,为搭建深度学习开发环境提供完整指导。

2501_93651177的博客 1845

算法 经典的八大排序算法详解和代码实现

算法 经典的八大排序算法详解和代码实现排序算法的介绍排序的分类算法的时间复杂度时间频度示例图表理解时间复杂度的特点时间复杂度常见的时间复杂度空间复杂度排序算法的时间复杂度冒泡排序基本思想图解代码示例结果展示代码优化结果展示选择排序基本思想图解代码实现结果展示插入排序基本思想图解代码实现结果展示希尔排序基本思想图解代码实现结果展示快速排序基本思想图解代码实现结果展示归并排序基本思想图解代码实现结果展示基数排序基本思想图解代码实现 排序算法的介绍 排序也称排序算法,排序时将一组数据,依指定的顺序进行排列的过程

菜鸟心声:学的不仅是技术,更是梦想! 4543

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

十大排序算法+图解分析(Java实现)

十大排序算法(Java实现) 文章目录十大排序算法(Java实现)冒泡排序基本思想图解代码实现算法优化选择排序基本思想图解代码实现插入排序基本思想图解代码实现希尔排序基本思想图解代码实现算法优化快速排序基本思想图解代码实现归并排序基本思想图解代码实现计数排序基本思想图解代码实现算法优化桶排序基本思想图解代码实现基数排序基本思想图解代码实现堆排序基本思想图解代码实现总结 冒泡排序 基本思想 冒泡排序:每次使用当前的数据a与当前数据的后一个数据b比较,如果a > b, 则交换;反之,不交换,第一次循环下来

m0_49039508的博客 310

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

排序-图解算法【简单选择排序、冒泡排序、插入排序、希尔排序、快速排序、归并排序】

各个排序的时间复杂度 简单选择排序 每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序;在每次比较时将最小的数的下标保存起来,这个一次循环完成后,再进行交换顺序 数组分成有序区和无序区,初始时整个数组都是无序区,然后每次从无序区选一个最小的元素直接放到有序区的最后,直到整个数组变有序区。 图解 实现 public void simpleChoiceSort(int[] data) { for (int i = 0; i < d

kayla_wzp的博客 362

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

五分钟掌握选择排序与其改良排序(希尔排序),内含详细手工过程图解与代码注释

五分钟掌握选择排序与其改良排序(希尔排序),内含详细手工过程图解与代码注释1、直接选择排序·手工过程:·实例验证2、改良的直接选择排序——堆排序·手工过程与详细图解·算法介绍与具体代码实现·实例验证 1、直接选择排序 ·手工过程: 例: ()9 5 1 4 6 7 8 5 3 0 9 (0)9 5 1 4 6 7 8 5 3 9 (0 1)9 5 4 6 7 8 5 3 9 (0 1 3)9 5 ...

coinph的博客 396

排序算法总结

冒泡排序 基本介绍 图解 源码 //将前面的冒泡排序算法,封装成一个方法 public static void bubbleSort(int[] arr){ //为了容器理解,我们把冒泡排序的演变过程,给大家展示出来 //第一趟就是把最大的数组排在最后 //临时变量 int temp = 0; //标识变...

fishermanMr 158

Java实现常用的排序算法(冒泡排序、选择排序、插入排序、希尔排序)

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。选择排序(Selection sort)是一种简单直观的排序算法。

weixin_46073538的博客 641

这或许是东半球分析十大排序算法最好的一篇文章

本文转自:https://mp.weixin.qq.com/s/sRk1t54-NMNvWtbub4N_6g 前言 本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程。 预计阅读时间 47 分钟,强烈建议先收藏然后通过电脑端进行阅读。 No.1 冒泡排序 冒泡排序无疑是最为出名的排序算法之一,从序列的一端开始往另一端冒泡(你可以从左往右冒泡,也可...

lixiaoxiong的专栏 425

关于我要对排序来个乌鸦坐飞机这件事(Java与c++)(冒泡,选择,插入,希尔,归并,快速,基数)

除了代码思想和部分思路分析是借助于老师的之外,其他任何都是作者与c++资深人士共同完成的,如图解的完成(特此说明,没有照搬网上的动图,我不放心),所有的图解都请勿随意搬运!若要搬运请联系作者,我将会从一下几点开始阐述每一个排序算法.排序算法的动图图解 🔜 排序算法的概述 🔜 排序算法的思想🔜 排序算法的起源代码与分析 🔜 排序算法的最终代码实现与分析 🔜 排序算法的优化 🔜 排序算法的结论

算法萌新一枚 1114
上一篇: 图解快速排序算法
下一篇: 插入排序算法
YoLo♪
YoLo♪ 优质创作者: Java技术领域 优质创作者: Java技术领域
博客等级 码龄5年 1万+粉丝 174原创
评论 71
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YoLo♪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值