爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      数据结构之八大排序-排序的相关介绍

      首页 知识中心 数据库 文章详情页

      数据结构之八大排序-排序的相关介绍

      2025-02-10 09:01:25 阅读次数:10

      冒泡排序,复杂度,序列,排序,数据,记录

      排序的相关介绍

      排序的概念:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

      稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

      内部排序:数据元素全部放在内存中的排序。

      外部排序:数据元素太多不能同时放在内存中,根据排序的要求在内外存之间移动数据的排序。

      数据结构之八大排序(上)

      两个5的相对位置发生了变化,就是不稳定的排序。

      注意:稳定的排序,也可以变成是不稳定的排序;而不稳定的排序无法变成稳定的排序。

      排序运用:我们日常生活中,在网上买东西时,根据价钱来筛选,这就用到了排序。

      常见的排序算法有八种,根据对数据的处理方式分类:

      数据结构之八大排序(上)

      下面我们就来详细学习:

      直接插入排序 

      思路:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。实际中我们玩扑克牌时,就用了插入排序的思想。 

      数据结构之八大排序(上)

      思路:

      数据结构之八大排序(上)

      数据结构之八大排序(上)

      代码实现:

          public static void insertSort(int[] array) {
              for (int i = 1; i < array.length; i++) {
                  int j = i-1;
                  int tmp = array[i];
                  while (j >= 0) {
                      if (array[j] > tmp) {
                          // 大于,就让其往后走
                          array[j+1] = array[j];
                          j--;
                      } else {
                          // 有序就直接判断后面的
                          break;
                      }
                  }
                  // 让tmp中的值回到数组中
                  array[j+1] = tmp;
              }
          }

      时间复杂度:O(N^2):最坏情况就是数据全部是逆序的。例如:我们是要排成从小到大的顺序,数据给的是 5 4 3 2 1。然而,当数据本身就是有序的情况下,也就只会进行判断,因此这时的时间复杂度就是O(N)。这里就可以得出一个结论:数据越有序,效率越高。

      空间复杂度:O(1) :只申请了常数个空间

      稳定性: 稳定的排序。本身是一个稳定的排序,可以实现为不稳定的。

      希尔排序(缩小增量排序)

      希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成多个组, 所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取重复上述分组和排序的工作。当到达分组 =1时,所有记录在统一组内排好序。如下图所示:

      数据结构之八大排序(上)

      这个gap的求值有很多种最常见的就是:总数据 / 2 和 总数据 / 3 + 1。

      代码实现:

          public static void shellSort(int[] array) {
              // 先分组
              int gap = array.length;
              while (gap > 1) {
                  gap /= 2;
                  // 根据分组来排序
                  shell(array, gap);
              }
          }
      
          // 分组排序
          private static void shell(int[] array, int gap) {
              // i 是组内要排序的第二个数据
              for (int i = gap; i < array.length; i++) {
                  // j 是组内要排序的第一个数据
                  int j = i-gap;
                  int tmp = array[i];
                  while (j >= 0) {
                      if (array[j] > tmp) {
                          array[j+gap] = array[j];
                          j -= gap;
                      } else {
                          break;
                      }
                  }
                  array[j+gap] = tmp;
              }
          }

      注意:

      1、希尔排序是对直接插入排序的优化。

      2、i 在加时,虽然 i += gap ,最终的排序结果是对的(因为gap 最终还是会等于1,就相当于直接进行直接插入排序了),但是并不符合逻辑要求。

      3、当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。

      4、希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算。

      时间复杂度:O(n^1.3 - n^1.5):很多著名的书籍上面的估算结果。

      空间复杂度:O(1):申请了常数个空间。

      稳定性:不稳定。

      选择排序

      基本思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。

      数据结构之八大排序(上)

      代码实现:

          public static void selectSort(int[] array) {
              for (int i = 0; i < array.length; i++) {
                  int minIndex = i;
                  for (int j = i+1; j < array.length; j++) {
                      // 更新最小值下标
                      if (array[j] < array[minIndex]) {
                          minIndex = j;
                      }
                  }
                  // 交换
                  if (minIndex != i) {
                      swap(array, i, minIndex);
                  }
              }
          }
      
          private static void swap(int[] array, int i, int j) {
              int tmp = array[i];
              array[i] = array[j];
              array[j] = tmp;
          }

      注意: 

      1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用。

      2. 时间复杂度:O(N^2):无论是最好情况还是最坏情况,时间复杂度都是一样的。也就是说和数据的顺序无关。

      3. 空间复杂度:O(1):申请了常数个空间。

      4. 稳定性:不稳定。 

      数据结构之八大排序(上)

      情况二属于第一个元素是重复的元素且不是最小的。 

      优化:既然是找最小值,那么我们直接既找最小值又找最大值,然后两头交换即可,这样效率就提升了不少。

      代码实现:

          public static void selectSort(int[] array) {
              int left = 0;
              int right = array.length-1;
              while (left < right) {
                  int minIndex = left;
                  int maxIndex = left;
                  for (int i = left+1; i <= right; i++) {
                      if (array[minIndex] > array[i]) {
                          minIndex = i;
                      }
                      if (array[maxIndex] < array[i]) {
                          maxIndex = i;
                      }
                  }
                  // 开始交换
                  swap(array, minIndex, left);
                  // 如果left位置是最大值,那么第一次交换时,就会把最大值换走,换成最小值
                  // 那么我们在第二次交换时,只会把最小值交换走,无法拿到最大值
                  if (maxIndex == left) {
                      maxIndex = minIndex;
                  }
                  swap(array, maxIndex, right);
                  left++;
                  right--;
              }
          }

      堆排序

      堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是:从小到大排序得建大根堆;从大到小排序得建小根堆。想要了解更多的知识,可以去看这篇博客:数据结构之探索“堆”的奥秘-CSDN博客

      思路:首先,就是要建一个大根堆,然后根据删除的思路来交换数据,再进行向下调整来重新使其变成大根堆。一直重复该步骤,直至遍历完成数组。

      代码实现:

          public static void heapSort(int[] array) {
              // 从小到大排序建大根堆
              createHeap(array);
              // 开始排序
              heap_sort(array);
          }
      
          private static void createHeap(int[] array) {
              // 向下调整建堆(时间复杂度比较小:O(N))
      
              // 从最后一棵子树的位置开始向下调整建堆
              for (int parent = (array.length-1-1)/2 ; parent >= 0; parent--) {
                  siftDown(array, parent, array.length);
              }
          }
      
          private static void siftDown(int[] array, int parent, int end) {
              int child = parent*2+1;
              // 大根堆
              while (child < end) {
                  // 先找到左右孩子的最大值
                  if (child+1 < end && array[child] < array[child+1]) {
                      child++;
                  }
                  // 判断孩子节点的值和父亲节点的值满不满足大根堆的要求
                  if (array[child] > array[parent]) {
                      swap(array, parent, child);
                      parent = child;
                      child = parent*2+1;
                  } else {
                      break;
                  }
              }
          }
      
          private static void heap_sort(int[] array) {
              // 模拟删除的思想
              int end = array.length-1;
              int start = 0;
              while (end > 0) {
                  swap(array, end, start);
                  siftDown(array, start, end);
                  end--;
              }
          }

      如果这个代码有疑惑的话,可以去看上面的链接博客,那里有画图更加的清晰明了。

      注意:

      1. 堆排序使用堆来选数,效率就高了很多。

      2. 时间复杂度:O(N*logN):向下建堆的时间复杂度为O(N) + 排序的时间复杂度为O(N*logN).

      数据结构之八大排序(上)

      3. 空间复杂度:O(1):只申请了常数个空间。

      4. 稳定性:不稳定。 

      数据结构之八大排序(上)

      冒泡排序 

      冒泡排序是属于交换排序的一种。

      交换排序,基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动(从小到大排序)。 

      其实这里已经告诉我们思路了,而且冒泡排序我们在C语言阶段,JavaSE阶段就进行了学习,因此下面就直接给出代码了。

      代码实现:

          public static void bubbleSort(int[] array) {
              // 冒泡排序的特点和堆排序一样,是后面的数据先有序
              for (int i = 0; i < array.length-1; i++) { // 趟数
                  boolean flag = true; // 假设数据已经有序了
                  for (int j = 0; j < array.length-1-i; j++) { // 每一趟比较的内容
                      if (array[j] > array[j+1]) {
                          swap(array, j, j+1);
                          flag = false; // 交换了,就说明数据还不是有序的
                      }
                  }
                  // 如果没有交换,就说明有序,则不在交换
                  if (flag) {
                      break;
                  }
              }
          }

      注意:

      1. 冒泡排序是一种非常容易理解的排序。

      2. 时间复杂度:O(N^2):在时间复杂度那篇博客中有详细介绍,有兴趣的小伙伴可以看一看。

      数据结构之八大排序(上)

      3. 空间复杂度:O(1):只申请了常数个空间。

      4. 稳定性:稳定。和直接插入排序一样,既可以实现为不稳定的,也可以实现为稳定的,因此冒泡排序是一个稳定的排序。

      好啦!本期 数据结构之八大排序(上)的学习之旅就到此结束啦!我们下一期再一起学习吧!

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/2301_80854132/article/details/140749547,作者:我要学编程(ಥ_ಥ),版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:MySQL——连接

      下一篇:LeetCode:541. 反转字符串II

      相关文章

      2025-05-19 09:04:53

      【NetApp数据恢复】误操作导致NetApp存储的卷丢失,卷内虚拟机无法访问的数据恢复案例

      【NetApp数据恢复】误操作导致NetApp存储的卷丢失,卷内虚拟机无法访问的数据恢复案例

      2025-05-19 09:04:53
      存储 , 数据 , 数据恢复 , 解压
      2025-05-19 09:04:44

      顺序查找法

      顺序查找法

      2025-05-19 09:04:44
      冒泡排序 , 最小值 , 查找 , 顺序
      2025-05-19 09:04:14

      复杂度的OJ练习

      复杂度的OJ练习

      2025-05-19 09:04:14
      代码 , 复杂度 , 思路 , 数组 , 算法
      2025-05-16 09:15:17

      BFS解决最短路问题(4)_为高尔夫比赛砍树

      BFS解决最短路问题(4)_为高尔夫比赛砍树

      2025-05-16 09:15:17
      BFS , lt , 复杂度 , 算法
      2025-05-16 09:15:10

      画图时使用的函数和一些错误处理

      画图时使用的函数和一些错误处理

      2025-05-16 09:15:10
      数据
      2025-05-16 09:15:10

      BFS解决FloodFill算法(3)_岛屿的最大面积

      BFS解决FloodFill算法(3)_岛屿的最大面积

      2025-05-16 09:15:10
      grid , 复杂度 , 算法
      2025-05-14 10:33:25

      超级好用的C++实用库之国密sm4算法

      国密SM4算法,全称为国家密码管理局制定的SM4分组密码算法,是中国自主设计的商用密码算法标准之一,用于数据的对称加密。

      2025-05-14 10:33:25
      加密 , 参数 , 数据 , 模式 , 解密
      2025-05-14 10:07:38

      30天拿下Rust之引用

      在Rust语言中,引用机制是其所有权系统的重要组成部分,它为开发者提供了一种既高效又安全的方式来访问和共享数据。引用可以被视为一个指向内存地址的指针,它允许我们间接地访问和操作存储在内存中的数据。

      2025-05-14 10:07:38
      Rust , text , 可变 , 引用 , 数据
      2025-05-14 10:07:38

      30天拿下Rust之所有权

      在编程语言的世界中,Rust凭借其独特的所有权机制脱颖而出,为开发者提供了一种新颖而强大的工具来防止内存错误。这一特性不仅确保了代码的安全性,还极大地提升了程序的性能。

      2025-05-14 10:07:38
      data , Rust , 内存 , 函数 , 变量 , 数据
      2025-05-14 10:03:13

      【MySQL】-数据库优化(索引)

      索引(index)是帮助数据库高效获取数据的数据结构

      2025-05-14 10:03:13
      index , Tree , 二叉 , 搜索 , 数据 , 索引 , 节点
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5275000

      查看更多

      最新文章

      【MySQL】-数据库优化(索引)

      2025-05-14 10:03:13

      SQL Server 执行计划3--关联查询

      2025-05-14 10:02:48

      mysql 语句如何优化

      2025-05-14 09:51:15

      java实现3. 无重复字符的最长子串

      2025-05-13 09:50:17

      elasticsearch删除脏数据(根据指定字段删除数据)

      2025-05-09 08:51:09

      数据库实训复习(1)

      2025-05-09 08:50:35

      查看更多

      热门文章

      ​云原生微服务K8s容器编排第七章之ETCD的使用及备份

      2023-03-16 07:45:55

      JSP之 MySQL 插入数据时,中文乱码问题的解决

      2022-11-14 02:56:39

      #yyds干货盘点# mysql常见面试问题

      2022-12-26 09:32:17

      数据结构与算法之四 搜索算法

      2022-11-17 12:37:20

      数组的升序排序 字符串的方法

      2023-04-21 03:15:03

      MySQL数据库(2):SQL简介

      2023-02-22 06:43:47

      查看更多

      热门标签

      数据库 mysql 字符串 数据结构 MySQL 算法 redis oracle java sql python 数据 索引 SQL 查询
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      delete删除记录数据库空间大小不减少问题

      Navicat12数据整体迁移

      NoSQL数据库学习第一天:了解基本概念与技术

      redis 持久化选择 rdb和aof

      数据结构刷题:二叉树的遍历与线索二叉树以及树、森林

      数据结构-用二维数组构造列表

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号