图解选择排序算法及优化

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

一文读懂GPU通信互联技术:GPUDirect、NVLink与RDMA

GPUDirect是NVIDIA开发的一项技术,旨在实现GPU与其他设备(如网络接口卡NIC和存储设备)之间的直接通信和数据传输,而无需CPU的参与。传统上,数据在GPU和另一个设备之间传输时,必须通过CPU,这导致潜在的性能瓶颈和延迟增加。GPUDirect技术则通过绕过CPU,直接访问和传输数据,显著提高系统性能。NVLink是NVIDIA开发的一种高速、高带宽的互连技术,用于连接多个GPU之间或GPU与其他设备(如CPU、内存等)之间的通信。

异构算力老群群(在读985计算机博士生)的技术博客 7774

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

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

金金金金金的博客 570

Unity UI适配核心:Canvas Scaler模式解析与2023版避坑指南

UI适配是游戏与应用开发中的基础挑战,其核心在于确保界面元素在不同屏幕分辨率与设备上保持视觉一致与功能可用。原理上,系统通过坐标转换与缩放计算,将设计稿的布局映射到物理屏幕。技术价值在于提升用户体验的一致性与产品的跨平台兼容性。应用场景广泛覆盖手游、PC端应用及各类交互界面。本文聚焦Unity引擎中的Canvas Scaler组件,深入剖析其Scale With Screen Size等模式的工作原理,并结合锚点设置、安全区域处理等高频搜索热词,提供解决UI错位、拉伸及异形屏适配等常见问题的工程实践方案,帮

weixin_30920597的博客 623

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

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

weixin_30356837的博客 214

【Python脚本】Python自动大麦网抢票,准点原价秒杀演唱会门票,拒绝黄牛交易!从我做起!!!1

你是否错过了周杰伦的票,最近又没抢到五月天的票,不要太难过,今晚有张学友的票,后天还有张杰的票,加油哦!

weixin_45841831的博客 6万+

【CV论文精读】【BEV感知】BEVFormer:通过时空Transformer学习多摄像机图像的鸟瞰图表示

3D视觉感知任务,包括基于多摄像头图像的3D检测和地图分割,对于自动驾驶系统至关重要。在这项工作中,我们提出了一个称为BEVFormer的新框架,它通过时空Transformer学习统一的BEV表示,以支持多个自动驾驶感知任务。简而言之,BEVFormer通过预定义的网格形状的BEV queries与空间和时间进行交互,从而利用空间和时间信息。为了聚集空间信息,我们设计了空间交叉注意力,每个BEV query从跨摄像机视图的感兴趣区域中提取空间特征。

weixin_44184852的博客 6018

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

CATIA P3 V5-6R2023在Windows 11 23H2上的稳定安装与系统级配置指南

CATIA是高端制造业核心的三维参数化设计平台,其运行依赖严格的系统底层支撑。理解CATIA的BRep几何内核原理与Windows子系统(如WSL、Hyper-V)的协同机制,是保障建模稳定性与计算精度的技术前提。CATIA Run-Time Library和OpenGL硬件加速能力共同决定了曲面重建、螺纹建模等关键操作的可靠性;而.NET Framework 3.5、VC++ 2022运行库及显卡Studio驱动的精准匹配,则构成工业软件在Win11环境落地的工程基础。本文聚焦于航空、轨交、能源等领域高频

weixin_30983353的博客 636

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

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

weixin_39884270的博客 110

vscode中运行gcc -v命令失败了,提示:gcc不是内部或外部命令...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 976

基于深度学习YOLOv8的花卉检测与识别系统(附完整资源+PySide6界面+训练代码)

通过本项目,我们成功实现了基于YOLOv8的花卉检测与识别系统,涵盖了数据预处理、模型训练、推理与实时检测、以及GUI界面的实现。YOLOv8在花卉检测中的高效性和准确性为实际应用提供了强有力的支持。

斌擎科技 716

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

SAP-ABAP:BAPI_INSPOPER_RECORDRESULTS 记录检验操作结果更新检验批状态详细解析

SAP-ABAP:BAPI_INSPOPER_RECORDRESULTS 记录检验操作结果更新检验批状态详细解析

baidu_35680696的博客 968

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

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

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

m0_49039508的博客 310

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

kayla_wzp的博客 362

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

余额充值