排序算法!

news2024/12/26 7:10:40

在这里插入图片描述

文章目录

  • 插入排序
  • 冒泡排序
  • 选择排序
  • 归并排序
  • 希尔排序

提示:本文分析算法复杂度时,默认目标是n个元素升序排序,代码注释已经写好,就不单独拎出来了

插入排序

插入排序就是把待排序序列的第一个元素看作是有序序列,把第二个元素到最后一个元素看作是乱序序列,然后循环乱序序列,将扫描到的每个元素插入到有序序列中,每次循环都要保证有序序列是有序的,循环结束,排序完成!

动画演示:
在这里插入图片描述

特征:
将元素划分为已排序和未排序两部分,遍历未排序元素,插入到已排序元素中,每次插入确保已排序元素都是有序的

时间复杂度分析:
最好:有序,时间复杂度O(n)
最坏:无序,时间复杂度O(n2)
平均:是输入规模的二次函数

总结:
因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千;或者若已知输入元素大致上按照顺序排列,那么插入排序还是一个不错的选择。 插入排序在工业级库中也有着广泛的应用,在STL的sort算法和stdlib的qsort算法中,都将插入排序作为快速排序的补充,用于少量元素的排序(通常为8个或以下)

插入排序Java实现

/**
 * 插入排序
 * @param arr
 */
public static void InsertionSort(int[] arr) {
    // 用于两数交换的临时变量
    int temp;
    // 从第二个数,即下标1开始依次遍历
    for (int i = 1; i < arr.length; i++) {
        // 每次遍历,需要和前面已经排好序的元素挨个比较,找到自己的位置
        for (int j = i - 1; j >= 0; j--) {
            // 判断前一个是否比后一个大,大的话就交换,从而找到合适的位置,升序
            if (arr[j] > arr[j + 1]) {
                // 交换两数位置
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

冒泡排序

比较相邻的元素,如果第一个比第二个大,就交换他们两个,循环对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。完成后,最后的元素就是最大的数。针对所有的元素重复以上的步骤,除了已经确定的元素。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较,排序完成!

动画演示:
在这里插入图片描述

特征:
两两比较,一趟得出一个极值

时间复杂度分析:
最好:最优时间复杂度O(n)
最坏:最坏时间复杂度O(n2)
平均:是输入规模的二次函数

冒泡排序Java实现

/**
 * 冒泡排序
 * @param arr
 */
public static void BubbleSort(int[] arr) {
    // 记录数组长度
    int len = arr.length;
    // 临时变量
    int temp;
    // 循环长度-1次
    for (int i = 0; i < len - 1; i++) {
        // 每次都会确定一个极值,所以使用 j < len - i - 1 
        // 避免不必要的循环
        for (int j = 0; j < len - i - 1; j++) {
            // 判断
            if (arr[j] > arr[j + 1]) {
                // 交换
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

选择排序

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

动画演示:
在这里插入图片描述

特征:
一趟计算出一个极大值或极小值,循环直到全部确定,排序完成!判断较多,元素换位较少

时间复杂度分析:
最好:有序,时间复杂度O(n2)
最坏:无序,时间复杂度O(n2)
平均:是输入规模的二次函数

总结:
由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快

选择排序Java实现

/**
 * 选择排序
 * @param arr
 */
public static void SelectSort(int[] arr) {
    int minIndex;
    int len = arr.length;
    for (int i = 0; i < len; i++) {
        minIndex = i;
        //遍历找出未排序中的元素中最小值下标
        for (int j = i; j < len; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        //若最小值下标与未排序中最左侧下标不一致则交换
        if (minIndex != i) {
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }
}

归并排序

归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序

动画演示:
在这里插入图片描述

在这里插入图片描述

特征:
分治思想

时间复杂度分析:
最好:有序,时间复杂度O(nlog(n))
最坏:无序,时间复杂度O(nlog(n))
平均:时间复杂度O(nlog(n))

总结:
速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列,归并排序的比较次数小于快速排序的比较次数,移动次数一般多于快速排序的移动次数

归并排序Java迭代实现

/**
 * 归并排序
 * @return
 */
public static void merge_sort(int[] arr) {
    int[] orderedArr = new int[arr.length];
    for (int i = 2; i < arr.length * 2; i *= 2) {
        for (int j = 0; j < (arr.length + i - 1) / i; j++) {
            int left = i * j;
            int mid = left + i / 2 >= arr.length ? (arr.length - 1) : (left + i / 2);
            int right = i * (j + 1) - 1 >= arr.length ? (arr.length - 1) : (i * (j + 1) - 1);
            int start = left, l = left, m = mid;
            while (l < mid && m <= right) {
                if (arr[l] < arr[m]) {
                    orderedArr[start++] = arr[l++];
                } else {
                    orderedArr[start++] = arr[m++];
                }
            }
            while (l < mid)
                orderedArr[start++] = arr[l++];
            while (m <= right)
                orderedArr[start++] = arr[m++];
            System.arraycopy(orderedArr, left, arr, left, right - left + 1);
        }
    }
}

希尔排序

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序,排序完成!

动画演示:
在这里插入图片描述

特征:
拆分

时间复杂度分析:
最好:有序,时间复杂度O(n)
最坏:无序,时间复杂度O(nlog2(n))

总结:
希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些

希尔排序Java实现

/**
 * 希尔排序(插入排序升级版)
 * @param arr
 */
public static void shellSort(int[] arr) {
    int length = arr.length;
    int temp;
    for (int step = length / 2; step >= 1; step /= 2) {
        for (int i = step; i < length; i++) {
            temp = arr[i];
            int j = i - step;
            while (j >= 0 && arr[j] > temp) {
                arr[j + step] = arr[j];
                j -= step;
            }
            arr[j + step] = temp;
        }
    }
}

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

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

相关文章

Internet Download Manager(IDM6.41)软件安装包下载及安装教程

Internet Download Manager有一个智能下载逻辑加速器&#xff0c;具有智能动态文件分割和安全的多部分下载技术&#xff0c;可以加速下载。与其他下载加速器和管理器不同&#xff0c;Internet下载管理器在下载开始之前对文件进行分段&#xff0c;而Internet下载管理器在下载过程…

华为云下Ubuntu20.04中Docker的部署

我想用Docker拉取splash&#xff0c;Docker目前已经无法使用&#xff08;镜像都在国外&#xff09;。这导致了 docker pull 命令的失败&#xff0c;原因是timeout。所以我们有必要将docker的源设置在国内&#xff0c;直接用国内的镜像。 1.在华为云下的Ubuntu20.04因为源的原因…

AMD Lisa Su专访:谈与英伟达、Intel竞争 直言Arm不是敌人

AMD CEO Lisa Su&#xff08;苏姿丰&#xff09;绝对称得上是芯片届的风云人物&#xff0c;尤其是进入了AI新时代&#xff0c;她的声望达到了十年来最高点。翻看其成长历史&#xff0c;苏姿丰在麻省理工学院获得电气工程博士学位后&#xff08;在麻省理工学院学习八年半&#x…

【Ardiuno】实验使用OPT语音模块播放语音(图文)

当我们需要在程序中播放语音内容时&#xff0c;就需要使用到语音模块&#xff0c;今天我们就来实验一下使用OPT语音模块来方法语音。 const int voicePin 5; const int voiceBusyPin 18; const int testLEDPin 2;unsigned long pmillis 0;int busyVal 0; …

C#联合Halcon机器视觉框架源码—升级版

相较于之前的NxtVision&#xff0c;本软件代码架构更加合理&#xff0c;且新增ui设计器、原来的vb脚本改为C#脚本&#xff0c;并尝试将视觉与运动控制相结合&#xff0c;是一体化的框架。 对源码有需求的&#xff0c;订阅本专栏后&#xff0c;私信我领取。

安卓网络通信(多线程、HTTP访问、图片加载、即时通信)

本章介绍App开发常用的以下网络通信技术&#xff0c;主要包括&#xff1a;如何以官方推荐的方式使用多线程技术&#xff0c;如何通过okhttp实现常见的HTTP接口访问操作&#xff0c;如何使用Dlide框架加载网络图片&#xff0c;如何分别运用SocketIO和WebSocket实现及时通信功能等…

记录一次centos扩容

背景 在Vscode上连虚拟机写项目&#xff0c;突然提示磁盘空间不足(no space left on device)&#xff0c;一开始打算删些东西&#xff0c;这里参考博客&#xff0c;写得挺清楚的&#xff0c;但是操作后我发现实在没啥文件可以删除&#xff0c;所以干脆不删了&#xff0c;直接扩…

Centos实现Mysql8.4安装及主主同步

8.4的Msyql在同步的时候与之前的版本有很大不同&#xff0c;这里记录一下安装流程 Mysql安装 官网下载 选择自己的版本&#xff0c;选第一个 复制下载链接 在服务器上创建一个msyql目录 使用命令下载,链接换自己的 wget https://dev.mysql.com/get/mysql84-community-relea…

【分布式计算】java消息队列机制

消息队列是一种在不同组件或应用之间进行数据传递的技术&#xff0c;通常用于处理异步通信。它允许消息的发送者&#xff08;生产者&#xff09;和接收者&#xff08;消费者&#xff09;之间进行解耦。 概念 消息队列是一种先进先出&#xff08;FIFO&#xff09;的数据结构&…

【react小项目】bmi-calculator

bmi-calculator 目录 bmi-calculator初始化项目01大致布局01代码 02完善样式02代码 03输入信息模块03代码 04 使用图表04代码 05详细记录信息渲染05代码 06 让数据变成响应式的06-1输入框的数据处理06-2图表&#xff0c;和记录信息的区域数据处理 07 删除功能&#xff0c;撤销功…

DeepDriving | 经典的目标检测算法:CenterNet

本文来源公众号“DeepDriving”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;经典的目标检测算法&#xff1a;CenterNet 1 前言 CenterNet是2019年发表的一篇文章《Objects as Points》中提出的一个经典的目标检测算法&#xf…

仓储管理系统WMS构架设计B/S和C/S:如何选?

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 在设计仓库管理系统&#xff08;WMS&#xff09;时&#xff0c;架构的选择至关重要&#xff0c;因为它直接影响到系统的可用性、可维护性、灵活性…

17岁中专女生,闯进全球数学竞赛12强

今年阿里的数学竞赛结果出来了&#xff0c;在榜单的前列包含一个 17 岁的中专女生。 在 2018 年时&#xff0c;阿里巴巴达摩院发起了一个国际数学竞赛&#xff0c;基本每年举办一次&#xff0c;参赛不设报名条件&#xff0c;向全球所有数学爱好者开放&#xff0c;竞赛由阿里创…

从FasterTransformer源码解读开始了解大模型(2.1)代码通读02

从FasterTransformer源码解读开始了解大模型&#xff08;2.0&#xff09;代码解读02-初始化和forward 写在前面的话 本篇的内容主要是介绍ParallelGpt.cc中的代码内容&#xff0c;首先介绍一些初始化和工具函数&#xff0c;然后会从forward主函数开始介绍一部分。 零、初始化…

【ROS里程计】中部分代码解释

bool OdomNodePub::Odom_Reset(ubt_odom::odomreset::Request& req, ubt_odom::odomreset::Response& res) {if(req.cmd "reset"){OdomResetFlag true;}else{OdomResetFlag false;}res.state "success";return true; } 该函数是一个ROS节点中…

元数据、数据元、数据字典、数据模型及元模型的区别详解

在数据管理和分析领域&#xff0c;有许多相似的概念&#xff0c;如元数据、数据元、数据字典、数据模型和元模型。这些概念的定义和应用往往容易混淆。 数据元 数据元是通过一系列属性描述的数据单元&#xff0c;包括定义、标识、表示以及允许值等。这些属性帮助我们理解和使用…

aop注解快速实现数据脱敏返回

说明&#xff1a; 公司之前数据接口数据管理不严格&#xff0c;很多接口的敏感数据都没有脱敏处理&#xff0c;直接返回给前端了&#xff0c;然后被甲方的第三方安全漏洞扫出来&#xff0c;老板要求紧急处理&#xff0c;常用的话在单个字段上加上脱敏注解会更加的灵活&#xf…

Parallels Desktop 19 for mac破解版安装激活使用指南

Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机&#xff0c;并于其中装设不同的操作系统&#xff0c;如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时&#xff0c;您可在 …

EarMaster7.5.74官方版安装激活使用教程

EarMaster就是你音乐路上的良师益友。这是一款来自丹麦皇家音乐学院的多媒体音乐教育软件&#xff0c;针对视唱练耳为音乐学生&#xff0c;音乐爱好者以及音乐专业人员都带来了很多的帮助&#xff0c;让你们可以获得音乐家般的耳朵&#xff0c;通过专业视唱练耳培训考试&#x…

52. QT插件开发--插件程序(带ui文件)的创建与编译

1. 说明 一般情况下,针对代码量比较小的QT程序不需要进行插件集成化开发,但是针对大型程序来说,代码结构比较复杂,使用插件开发的方式可以提高代码开发和维护效率,团队之间的分工合作也会更加的明确。所谓插件式开发,实际上就是把程序的一部分功能封装起来,编译成一个单…