当前位置: 首页 > news >正文

Java数据结构-排序

目录

一.本文关注焦点

二.七大排序分析及相关实现

1.冒泡排序

2.简单选择排序 

3.直接插入排序

4.希尔排序

5.堆排序

​编辑

6.归并排序

7.快速排序

附录:排序对比


一.本文关注焦点

各种排序的代码实现及各自的时间空间复杂度分析及稳定性。

时间复杂度:在比较排序中主要指排序中两数比较交换次数

空间复杂度:在比较排序中指除原来存储数据开辟的空间外在排序过程又开辟的其它空间

时间复杂与空间复杂度计算自行学习:
时间复杂度和空间复杂度(超详细)-CSDN博客

稳定性:指排序过程中数据的相对位置是否发生改变

介绍如下图:

当前未排序时黑色5在红色5之前,若排序后黑5仍然在红5之前,即二者的相对位置未发生改变,则该排序稳定,否则称该排序不稳定。

需要注意的是:稳定排序可更改为不稳定排序,而不稳定排序一定是不稳定排序 

二.七大排序分析及相关实现

1.冒泡排序

冒泡排序动图:

https://i-blog.csdnimg.cn/direct/068c355a675c4d16918587bbab62ea53.gif

此冒泡排序还能继续进行优化 

空间复杂度分析:除为存储数组开辟空间外,在排序过程中只开辟一个辅助空间因此为O(1)。

时间复杂度: 

最坏:

将内外循环完全进行

最好:

序列已经有序经优化后只进行一趟比较可达O(n).

稳定性: 稳定

交换时等于并未进行交换,保持了数据的相对位置不变。

2.简单选择排序 

动图:

https://i-blog.csdnimg.cn/blog_migrate/e6eeb7ba10b2d32e4f3fb4efa470e01e.gif

空间复杂度:除存放数据数组外排序过程只开辟minIndex用来记录最小下标所以为O(1)。

时间复杂度:

最坏:

(n-1)+(n-2)+........+1 = n^2/2所以为O(n^2);

最好:

及时数据有序仍然需要进行比较所以仍然为O(n^2);

稳定性:稳定

此处比较不是<= 确保排序的稳定

3.直接插入排序

直接插入排序动图演示:
https://i-blog.csdnimg.cn/direct/5245b6cc9d6345398db1515e31632477.gif#pic_center

空间复杂度:除存储数组本身数据外只取一tamp空间所以为O(1)

时间复杂度:

最坏:

逆序时每次排序都要与有序区间数字全部比较一遍。

1+2+3+......+(n-2)+(n-1)=n^2/2所以复杂度为O(n^2) 

最好:

已经有序时

每次排序只需比较一次

1+1+1+...+1 = n-1所以为O(n)

稳定性:稳定

此处为>,不会使相同元素的相对位置发生改变。

4.希尔排序

希尔排序动图:

https://i-blog.csdnimg.cn/blog_migrate/420f5c5abac4bb459aaee2f95aaaf35f.gif

希尔排序可看做是直接插入排序的优化

空间复杂度: 

空间复杂度:除存储数组本身数据外只取一tamp空间所以为O(1)

时间复杂度:通常为O(n^1.3)~O(n^2)

最坏:O(n^2)非常少见

最好:O(nlogn)

稳定性:不稳定

希尔排序为跳跃式分组排序,排序后相同元素相对位置可能发生改变

5.堆排序

堆排序动态演示:

https://i-blog.csdnimg.cn/direct/a94c12bdf4fe4e03bfdf54a9a5aca3fe.gif#pic_center

此处1314送给各位看官。。

空间复杂度:排序过程中除存储数组本身数据外不取其它额外空间所以为O(1)

时间复杂度:

最坏:O(nlogn)

最好:O(nlogn)

堆排序的时间复杂度只与创建堆与调整堆有关与数据顺序无关

创建堆时每个非叶子结点最多进行两次交换因此其时间复杂度为O(n)

排序时每次调整堆的时间复杂度为logn,需要调整n-1次所以时间复杂度为O(nlogn)

总体为(O(n+1)logn)也就是O(nlogn).

稳定性:不稳定

6.归并排序

动画演示:

https://i-blog.csdnimg.cn/direct/cc1443bd7a3348f39013f146a3c1f1ca.gif#pic_center

空间复杂度:除本身为存储数组开辟空间外,还需要开辟辅助空间tampArr最终长度为n,所以空间复杂度为O(n).

时间复杂度:

最坏:O(nlogn)

最好:O(nlogn)

因为归并排序递归分割过程相当于二叉树,树高计算为logn此时分割完成,合并阶段每层和并数组大小为m+n,则logn层可计算为O(nlogn).

稳定性:稳定

归并排序性能不受输入数据的影响且稳定,代价为空间。

7.快速排序

动态演示:

https://i-blog.csdnimg.cn/blog_migrate/88b8eb041f669690da648466be9d2ddb.gif

基本版本实现(挖坑法找基准):

Hoare法:

三数取中优化:

空间复杂度:只有递归调用栈占用空间

最坏:单分支数高度为n,所以复杂度为O(n).

最好:完全二叉树,树高为logn所以复杂度为O(logn)

时间复杂度:

最坏:单分支树,退化为冒泡排序O(n^2)

最好:完全二叉树树高为logn,每次需要比较两次要比较n次,所以时间复杂度为O(nlogn).

稳定性:不稳定

附录:排序对比

相关文章:

  • 微信小程序-组件复用机制behaviors
  • Mono里运行C#脚本43—System.Console.WriteLine()函数的生成过程
  • ThinkORM模型静态方法create好像对MongoDB不支持
  • 深度学习-7.超参数优化
  • CSS按钮点击效果实战:scale(0.95) 与10个交互动画优化指南
  • 体育品牌排行榜前十名:MLB·棒球1号位
  • 【含开题报告+文档+PPT+源码】基于springboot加vue 前后端分离的校园新闻审核发布管理系统
  • linux常用基础命令_最新版
  • Apifox 增强 AI 接口调试功能:自动合并 SSE 响应、展示DeepSeek思考过程
  • 这个 Python 库,隐藏了你不知道的数据库操作技巧
  • @media 的常用场景与示例
  • [ProtoBuf] 介绍 | 保姆级win/linux安装教程
  • Windows 11 使用容器(Docker Podman)
  • git如何打patch
  • netty基础知识梳理和总结
  • Python爬虫实战:爬取豆瓣电影
  • 公文派2025:免费社区版重大安装更新!
  • 动态链接器(九):.init和.init_array
  • 什么是手机9008模式?如何进入9008
  • 技术解析 | 适用于TeamCity的Unreal Engine支持插件,提升游戏构建效率
  • 习近平结束对俄罗斯国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典回到北京
  • 巴西总统卢拉将访华
  • 聆听百年唐调正声:唐文治王蘧常吟诵传习的背后
  • 14岁女生瞒报年龄文身后洗不掉,法院判店铺承担六成责任
  • 早期投资人蜂巧资本清仓泡泡玛特套现超22亿港元,称基金即将到期
  • 融创中国:今年前4个月销售额约112亿元