基础排序算法(附加java实现)

七种最基本的排序算法:(面试必会!)

冒泡排序:

最基础的排序算法,从数列最前端开始,两两比较,如果前一个数比后一个数大,那么两个数就交换位置,经过一轮遍历之后,最大的数就到了数列的最后一个位置上,再进行下一次循环,第二大的数就浮到了倒数第二个位置,这样一步步较大的数往上浮的过程就是冒泡排序。

java实现:

时间复杂度 O(n^2),空间复杂度O(1),稳定性(a=b,排序前a在b的前面,排序后仍在前即为稳定):稳定

选择排序:

将一个数列看成有序区和无序区,刚开始,有序区没有元素,无序区就是整个列表。将无序区的最大(或者最小)的元素找到,并与无序区的第一个元素交换位置,那么这时,无序区的第一个元素就是最大(或者最小的),此时无序区就变为第一个元素之后的剩余元素,再对剩余元素进行找最大(或者最小)元素的操作,并再把该元素与此时无序区第一个元素位置互换,依次类推,那么整个数列中最大(或者最小)的元素就依次排在了数列中

Java实现:(注意:选择排序在实现时,是记录最大值的索引,如果出现更大的值,就更新索引,最后通过索引互换元素)

时间复杂度 O(n^2),空间复杂度O(1),稳定性:不稳定

插入排序:

插入排序也比较直观,通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

插入排序在实现上,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

时间复杂度 O(n^2),空间复杂度O(1),稳定性:稳定

希尔排序:

插入排序的改进版,确定一个间隔,然后根据这个间隔进行分组,这个间隔通常为总长度的一半,奇偶数均可。先进行组内排序,组内排序用插入排序的方法。当每组排完序以后,间隔数减半,重新进行分组并进行插入排序,知道间隔数为1,那么此时对整个数组进行插入排序。

那么为什么使用希尔排序呢?那是因为,当数列元素数目多大的时候, 插入排序的比较次数会远远大于希尔排序。

Java实现

时间复杂度 O(n^1.3),空间复杂度O(1),稳定性:不稳定

归并排序:

核心思想为分治法,并通过递归实现。将长度为n的序列分成两个长度为n/2的子序列,对这两个子序列分别采用归并排序,最后将两个排序好的子序列合并成一个最终的排序序列。

Java代码待更新

时间复杂度 O(nlog以2为底n的对数),空间复杂度O(n),稳定性:稳定

快速排序:

快速排序也是分治法加递归的思想,首先从数列中挑出一个元素作为基准(pivot);重新排列数列,所有比基准小的元素放在基准前面,所有比基准大的摆在后面,(相同的数可以到仍一边)。在这个分区退出以后,该基准就处在数列的中间位置。递归地把小于基准值元素的子数列和大于基准值元素的子数列排列。

Java代码待更新

….

时间复杂度 O(nlog以2为底n的对数),空间复杂度O(nlog以2为底n的对数),稳定性:不稳定

堆排序:

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:

Java代码实现待更新:

时间复杂度 O(nlog以2为底n的对数),空间复杂度O(1),稳定性:不稳定

Original: https://www.cnblogs.com/AICROC/p/13027968.html
Author: 生于思考
Title: 基础排序算法(附加java实现)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/644155/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • classnames 和 css-module 一起使用

    common.less css;gutter:true; .server-btn-disabled { cursor: not-allowed; color: rgb(165, 1…

    技术杂谈 2023年5月30日
    082
  • c#使用selenium过滑动验证码

    滑动验证码如下: 1、vs引入以下三个包(.net core 3.1): 2、c#引用: private void SeleniumVertifyCode(Uri uri) { v…

    技术杂谈 2023年5月30日
    099
  • 拿到任务,先做分解

    分解的目的:简化问题的复杂度 分解任务的好处 怎么分解: 抓住重点,去掉不必要的东西,留下必须要做的,找到任务的主干 按单一职责原则对任务拆解,罗列功能点(比如要实现一个XX模块,…

    技术杂谈 2023年7月25日
    074
  • 「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之文件上传(十)

    基于Vue和Quasar的前端SPA项目实战之文件上传(十) 回顾 通过之前一篇文章基于Vue和Quasar的前端SPA项目实战之数据导入(九)的介绍,实现了业务数据批量导入功能,…

    技术杂谈 2023年7月24日
    077
  • 时间序列–Holt-Winters

    Holt-winters 三次指数平滑 原始预测——简单平均——移动平均———加权移动平均 1)单指数平滑法:s(t+1)= ax(t) + (1-a) s(t-1) , a 许更…

    技术杂谈 2023年5月31日
    0101
  • AWS产品目录

    Loading 计算 Amazon EC2:弹性虚拟机 AWS Batch:批处理计算 Amazon ECR:Docker容器管理 Amazon ECS:高度可扩展的快速容器管理服…

    技术杂谈 2023年5月30日
    081
  • Mysql详解

    Mysql的介绍 【1】MySQL是一个轻量级关系型数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,就增加了速度并提高了灵活性。 【2】sql语言分类: …

    技术杂谈 2023年7月24日
    066
  • 什么是元类

    元类是什么 Python程序员经常说一句话:”一切皆对象”,意思是在Python中,你能见到的所有东西,包括int, float, function等等都是…

    技术杂谈 2023年7月11日
    081
  • Python导入cx_Oracle报错

    系统环境:RHEL5.4 python2.5(手动编译安装,系统带有2.4版本) 在使用python脚本访问数据库时,需要导入cx_Oracle模块 $>>>im…

    技术杂谈 2023年7月11日
    063
  • Takeown–夺取文件or文件夹所有权

    强制将当前目录下的所有文件及文件夹、子文件夹下的所有者更改为管理员组(administrators)命令:takeown /f * /a /r /d y 将所有d:\documen…

    技术杂谈 2023年6月1日
    084
  • 获取不到数据库连接问题

    org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; …

    技术杂谈 2023年7月23日
    054
  • CS144lab笔记

    下面看代码: lab0 webget.cc 点击查看代码 webget.cc byte_stream.hh 点击查看代码 // ccm #ifndef SPONGE_LIBSPON…

    技术杂谈 2023年7月24日
    086
  • Docker-dockerfile

    Docker-通过Dockerfile创建镜像 1.Dockerfile简介 简而言之,Dockerfile 是一个描述如何创建 Docker 镜像所需步骤的文本文件。 一个Doc…

    技术杂谈 2023年7月10日
    081
  • 墨菲定律 by 张鹏程

    社会法制 巴纳姆效应:一定戴在谁头上都合适的帽子 彼得原理:找到适合自己的位置 马太效应:多的越多,少的越少 蘑菇定律:先当”小苗”,才能做”大…

    技术杂谈 2023年7月25日
    066
  • Docker安装Nginx

    #1、搜索Nginx docker search nginx #2、拉取nginx镜像 docker pull nginx #3、查看nginx是否下载成功 docker imag…

    技术杂谈 2023年7月24日
    062
  • Linux学习笔记(一)初识Linux

    初始Linux Linux可划分为以下四部分: Linux内核 GNU工具 图形化桌面环境 应用软件 每一部分在Linux系统中各司其职,下图是各部分对应关系: 1、Linux内核…

    技术杂谈 2023年7月11日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球