图解选择排序算法及优化

【排序】选择排序(含优化版) 冒泡排序的时间复杂度为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

常用本体建模工具

常用本体建模工具: Apollo、OntoStudio、TopBraid Composer、Semantic Turkey、Knoodl、Chimaera、OliEd、WebODE、Kmgen和DOME Protégé Protégé[1]是一款由斯坦福大学编写并维护的开源本体建模和编辑工具,其支持Web版本和PC版本,使用OWL语言(关于OWL的详细介绍可参看前文2.1节内容)对知识进行表示,读者可以通过Protégé的官方网站访问Web版本或下载桌面版本。Protégé最早开发于1987年,最初目的是

qq_40503347的博客 6165

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

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】STM32 CANFD外设的几种消息接收过滤模式

在控制器区域网络(CAN)系统中,正确配置消息过滤器对于有效管理网络通信至关重要。特别是在使用Flexible Data-rate Controller Area Network(FDCAN)时,选择合适的过滤器类型可以大大提高网络效率和消息处理速度。

林愿留的博客 6227

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

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

weixin_30356837的博客 214

粒子滤波在基于误差状态量的INS/GNSS组合导航中的使用技巧-On Particle Filter based Error-State INS/GNSS Intergrated Navigation

本文面向以15维惯导(INS)误差为状态量,3维位置误差为量测量的INS/GNSS组合导航系统,​在西工大严恭敏老师的开源工具箱中PF相关库函数基础上实现基于粒子滤波(PF)的惯导误差状态量的递推估计,设计了粒子重置环节并强调了其在本特定场景下的重要性。

I33D33I的博客 1742

python进行windows系统UI自动化之【pyautoit】

一般以我们平时操作,会从下图上方的地址栏进行操作,这里注意可以直接从下方的文件名处,输入对应的绝对地址,如:F:\程序设计书籍\《啊哈!pyautoit 是一个用python写的基于AutoItX3.dll的接口库,用来进行windows窗口的一系列操作,也支持鼠标键盘的操作。点击上访的图标,进行拖拉,到想访问的位置,注意下图两个红框中的数值,上面的框表示页面的标题和类,下面的框表示控件的类和序号(一般连起来使用)打开Auto Window Info(x64)或Auto Window Info(x86)

weixin_43936332的博客 9315

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

用于可靠的钙钛矿薄膜瞬时光致发光模拟的拟合程序

简介 对光激发后的电荷载流子动态的研究对于确定太阳能电池的几个特性至关重要,例如,体和界面重组的数量以及向电荷传输层转移过程的速度。 瞬态光致发光(trPL)是用于研究这些特性的最流行的表征方法之一。 该实验是通过在样品上照射几纳秒的激光脉冲,并记录一段时间内的发光情况来进行的。辐射性重组的光生电荷载流子将引起太阳能电池的光子发射,而非辐射性重组的电荷载流子将不会对发光作出贡献。因此,可以测量到强度随时间递减的光致发光瞬态。(见图1表示trPL的测量和它的输出)。 图1. 一...

FluximAG的博客 2362

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

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

weixin_39884270的博客 110

嵌入式开发必备:aarch64-linux-gnu-gcc交叉编译工具链保姆级安装指南(含常见错误解决)

本文详细介绍了aarch64-linux-gnu-gcc交叉编译工具链的安装与配置方法,涵盖从系统软件源安装到Linaro二进制包部署的全流程。针对嵌入式开发中常见的依赖错误、版本冲突等问题提供实用解决方案,并分享性能优化技巧与项目集成经验,帮助开发者高效完成ARM64设备的跨平台开发。

yoga7的博客 1030

TMF8801 ToF激光测距传感器原理图设计,已量产(距离传感器)

这张 TMF8801 小板的外围结构就很有代表性。核心传感器是 U1 TMF8801,但真正构成量产价值的是外围那一圈:U2 把 VCC 整理成 3V,R1/R2/R5 与 R3/R4/R6 两组 10K 电阻稳定默认态,Q2 2N7002 和 U3 SN74LVC2G07DCKR 处理控制链路,传感器边上还有 C1/C4/C5 三颗 100nF 紧贴去耦。

不脱发的程序猿 159

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

大数据平台符合信创(CDH国产化代替)详细方案(企业内部不外传方案)

信创旨在实现信息技术产业的自主可控,减少对外部技术的依赖,从而提升国家信息安全和经济发展的自主性。在此背景下,中国对信创提出了更高的要求,以期在激烈的市场竞争中占据有利地位。信创不仅关乎技术层面的创新,更涉及到产业链条的整合与优化。它要求从基础硬件、操作系统、数据库、中间件等各个层面实现国产替代,构建完整的信息技术生态体系。尤其是在做国企项目时,就有硬性要求使用符合信创(国产代替)。在信创背景下,符合要求的产品必须具备自主可控、安全可靠以及性能卓越等核心特点。

大模型大数据攻城狮的专栏 3510

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

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

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

m0_49039508的博客 310

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

kayla_wzp的博客 362

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

五分钟掌握选择排序与其改良排序(希尔排序),内含详细手工过程图解与代码注释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、付费专栏及课程。

余额充值