【数据结构-排序】内部排序

news2024/11/20 15:34:40

文章目录

    • 1 直接插入排序
      • 1.1 算法简要思想
      • 1.2 算法特性
    • 2 希尔排序
      • 2.1 算法简要思想
      • 2.2 手动模拟
      • 2.3 算法特性
    • 3 冒泡排序
      • 3.1 算法简要思想
      • 3.2 算法特性
    • 4 快速排序
      • 4.1 算法思路
      • 4.2 算法代码
      • 4.3 手动模拟
      • 4.4 算法特性
      • 4.5 相关例题
    • 5 简单选择排序
      • 5.1 算法简要思想
      • 5.2 算法特性
    • 6 堆排序
      • 6.1 建立大根堆(手动模拟)
      • 6.2 堆排序(手动模拟)
      • 6.3 算法特性
    • 7 基数排序
      • 7.1 手动模拟
      • 7.2 算法特性

  • 对任意 n 个关键字排序的比较次数至少为log2(n!)(向上取整)

1 直接插入排序

1.1 算法简要思想

每一趟排序中,数列的前面为有序序列,后面为无序序列。

每一趟排序中,均选取无序序列中的第一个元素,插到有序序列的正确位置。

1.2 算法特性

  • 【时间复杂度】最好:O(n);最坏:O(n2);平均:O(n2)
  • 【空间复杂度】O(1)
  • 【稳定性】稳定
  • 【适用性】顺序存储、链式存储
  • 【性质】每趟排序后,最左端或最右端总是有序的

2 希尔排序

2.1 算法简要思想

设置一个步长 d,将无序序列分为 d 个表,对各个子表进行直接插入排序,然后再取第二个步长重复上述过程。

2.2 手动模拟

原始序列:4,2,3,1,16,10,9,14,8,7

在这里插入图片描述

2.3 算法特性

  • 【时间复杂度】最坏:O(n2)
  • 【空间复杂度】O(1)
  • 【稳定性】不稳定
  • 【适用性】顺序存储

3 冒泡排序

3.1 算法简要思想

每一趟排序(冒泡)中,从后往前(或从前往后)两两比较相邻元素的值,若为逆序则交换。

每一趟的结果是将最小的元素交换到序列的第一个位置(或将最大的元素交换到序列的最后一个位置)。

3.2 算法特性

  • 【时间复杂度】最好:O(n);最坏:O(n2);平均:O(n2)
  • 【空间复杂度】O(1)
  • 【稳定性】稳定
  • 【适用性】顺序存储
  • 【性质 1】每趟排序后,总有一个元素放置在最终位置上
  • 【性质 2】每趟排序后,最左端或最右端总是有序的

4 快速排序

4.1 算法思路

  • 选取区间 A 最左边的元素 x 作为基准值;
  • 从区间 A 的最右边开始,往左找,碰到第一个比 x 小的元素时停下,把下标记为 j;(基准数在最左边,必须从最右边开始扫描!
  • 从区间 A 的最左边开始,往右找,碰到第一个比 x 大的元素时停下,把下标记为 i;
  • 交换 A[i] 和 A[j];
  • 继续从 j 往左找,再从 i 往右找,重复上述过程,直到 i 和 j 碰面为止,将 A[i] 与第一个元素 x 交换;
  • 将区间 A 分为两段:[最左边, i-1],[i+1, 最右边](或[最左边, j-1],[j+1, 最右边]),重复上述过程。

4.2 算法代码

void QSort (int A[], int low, int high){
    if (low >= high)
        return;

    int i = low, j = high; // 左右指针分别指向区间两端
    int pivot; // 基准值
    
    将 A 数组中随机一个元素和 A[low] 交换; // 随机选取基准值
    pivot = A[low]; // 最左边作为基准值
    
    while (i != j){
        while ((i < j) && (A[j] > pivot)) // 右指针从区间右端往左端移动
            j--;
        while ((i < j) && (A[i] <= pivot)) // 左指针从区间左端往右端移动(注意还有等于条件)
            i++;
        if (i < j)
            swap(A[i], A[j]); // 交换 A[i] 和 A[j]
    }
    
    swap(A[low], A[i]); // 将基准值放入最终位置
    QSort(A, low, i-1); // 递归处理左区间
    QSort(A, i+1, high);  // 递归处理右区间
}

4.3 手动模拟

原始序列:49,38,65,97,13,76,27,49,52,5

在这里插入图片描述
在这里插入图片描述

4.4 算法特性

  • 【时间复杂度】最好:O(nlog2n);最坏:O(n2);平均:O(nlog2n)
  • 【空间复杂度】最好:O(log2n);最坏:O(n);平均:O(log2n)
  • 【稳定性】不稳定
  • 【适用性】顺序存储
  • 【一趟的定义】排序过程中,对尚未确定最终位置的所有元素进行一遍处理
  • 【性质 1】每趟排序后,总有一个元素放置在最终位置上
  • 【性质 2】第 i 趟排序完成后,会有 i 个以上的数出现在它最终将要出现的位置
  • 【性质 3】当每次的枢轴把表等分为长度相近的两个子表时,速度是最快的
  • 【性质 4】当表本身已经有序或逆序时,速度最慢

4.5 相关例题

【例 1】下列选项中,不可能是快速排序第 2 趟排序结果的是( )

A. 2,3,5,4,6,7,9

B. 2,7,5,6,4,3,9

C. 3,2,5,4,7,6,9

D. 4,2,3,5,7,6,9

【解法一】第 i 趟排序完成后,会有 i 个或以上的数出现在它最终将要出现的位置,即它左边的数比它小,右边的数比它大。

由于题目问的是第 2 趟排序结果,因此分析每个选项能否找到两个或以上这样的数(符合的数被加粗),即它左边的数比它小,右边的数比它大。

  • A 项:23,5,4,679
  • B 项:2,7,5,6,4,3,9
  • C 项:3,2,5,4,7,6,9 (只找到一个)
  • D 项:4,2,3,5,7,6,9

所以选 C。

【解法二】由于第 i 趟排序完成后,会有 i 个或以上的数出现在它最终将要出现的位置,所以只需将最终的排序结果写出来,再跟每个选项进行对比,符合条件的结果应该有两个以上的元素相同(加粗)。

  • 最终:2,3,4,5,6,7,9
  • A 项:23,5,4,679 (有 5 个相同)
  • B 项:2,7,5,6,4,3,9 (有 2 个相同)
  • C 项:3,2,5,4,7,6,9 (只有 1 个相同)
  • D 项:4,2,3,5,7,6,9 (有 2 个相同)

所以选 C。

【例 2】排序过程中,对尚未确定最终位置的所有元素进行一遍处理称为一“趟”。下列序列中,不可能是快速排序第二趟结果的是( )

A. 5, 2, 16, 12, 28, 60, 32, 72

B. 2, 16, 5, 28, 12, 60, 32, 72

C. 2, 12, 16, 5, 28, 32, 72, 60

D. 5, 2, 12, 28, 16, 32, 72, 60

【解】由于第 i 趟排序完成后,会有 i 个或以上的数出现在它最终将要出现的位置,所以只需将最终的排序结果写出来,再跟每个选项进行对比,符合条件的结果应该有两个以上的元素相同(加粗)。

  • 最终:2, 5, 12, 16, 28, 32, 60, 72
  • A 项:5, 2, 16, 12, 28, 60, 32, 72
  • B 项:2, 16, 5, 28, 12, 60, 32, 72
  • C 项:2, 12, 16, 5, 28, 32, 72, 60
  • D 项:5, 2, 12, 28, 16, 32, 72, 60

第一趟排序,确定一个元素位置,第二趟排序,又可以确定一个或两个元素位置。

  • 当第一趟元素确认的位置为最左或最右时,第二趟排序只能确认一个位置(A,B 项)
  • 当第一趟元素确认位置不是最左或最右时,第二趟能确认 2 个位置(C 项)

所以选 D。

【注】按以上思路分析例 1 的选项,发现均符合上述规律。

5 简单选择排序

5.1 算法简要思想

每一趟排序中,数列的前面为有序序列,后面为无序序列。

每一趟排序中,均在无序序列中选取关键字最小的元素,插到有序序列的最后一个位置。

5.2 算法特性

  • 【时间复杂度】最好:O(n2);最坏:O(n2);平均:O(n2)
  • 【空间复杂度】O(1)
  • 【稳定性】不稳定
  • 【适用性】顺序存储、链式存储
  • 【性质】每趟排序后,最左端或最右端总是有序的

6 堆排序

6.1 建立大根堆(手动模拟)

原始序列:4,2,3,1,16,10,9,14,8,7

从第 n/2(向下取整)个结点开始,依次向前对第 n/2(向下取整)个至第 1 个结点的子堆。

注意,每次交换后,都要对下一层的子堆进行递归调整,因为交换后有可能破坏已调整子堆的结构。

在这里插入图片描述
在这里插入图片描述

6.2 堆排序(手动模拟)

每次输出堆顶元素后,将堆的最后一个元素与堆顶元素交换,此时堆的性质被破坏,需要向下进行调整堆。

在这里插入图片描述
在这里插入图片描述

6.3 算法特性

  • 【时间复杂度】最好、最坏、平均:O(nlog2n)
  • 【空间复杂度】O(1)
  • 【稳定性】不稳定

7 基数排序

7.1 手动模拟

排序顺序:个位、十位、百位。

放入桶中时一定要注意先后顺序,要用链表串起来!

取出桶时也一定要注意先后顺序!遵守先进先出原则!

在这里插入图片描述

7.2 算法特性

  • 【时间复杂度】最好、最坏、平均:O(d(n+r))
  • 【空间复杂度】O(r)
  • 【稳定性】稳定

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

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

相关文章

了解网络保险以及为什么它对您的业务很重要

本文&#xff0c;我们将探讨网络保险&#xff0c;它如何在发生网络攻击时帮助企业&#xff0c;以及为什么您的企业组织需要它。 大流行后的工作场所在很大程度上转向远程优先或混合安排&#xff0c;员工使用各种个人设备连接到公司网络。不良的网络卫生实践、缺乏足够的网络安全…

IDEA懒人必备插件:自动生成单元测试,太爽了!

今天&#xff0c;我们将介绍一个工具Squaretest&#xff0c;它是一个用于自动生成单元测试的插件。它也将被使用&#xff0c;因为该公司最近实施了代码质量控制指标&#xff0c;以评估各种项目的单元测试覆盖率和声纳扫描的各种问题。 许多旧项目和旧代码&#xff0c;或者需要匆…

ArcGIS基础:在线数据上生成规则采样点

需求&#xff1a;在线要素上等间距生成一定数量的采样点或者在线数据上随机生成一系列的采样点 原始数据如下所示&#xff0c;为一个普通的线数据&#xff0c;以下操作是在此线数据上生成一定数量的采样点。 注意&#xff1a;切记&#xff0c;点要素和线要素数据都要为shp格式…

飞桨生态之FastDeploy预编译库的使用方法

飞桨生态之FastDeploy预编译库的使用方法1 FastDeploy2 下载FastDeploy编译demo方法1 FastDeploy 为什么采用FastDeploy,由于之前使用PaddleOCR(paddlle_inference)框架的代码做推理&#xff0c;造成实际显存一直开辟&#xff0c;不释放我的问题&#xff0c;刚开始两个模型占用…

vxlan转发原理

openstack neutron组件也用到了vxlan&#xff0c;还有dvr&#xff0c;在云计算环境到底分布式网关好还是集中式网关好&#xff0c;vxlan对称还是非对称转发好&#xff0c;什么样的控制平面好&#xff0c;要对这些问题得出结论不管怎样先得深刻理解vxlan转发流程。 三层转发就是…

Java——继承——Extends

继承为什么要继承呢&#xff1f;继承的语法继承的概念子类中访问父类性质Java的单继承super和this子类构造方法protected中super的使用final关键字今天我们来说说面向对象的又一特征&#xff1a;继承&#xff01;为什么要继承呢&#xff1f; class Dog{public String name;pub…

QT Qmake 笔记

文章目录概述QT修改样式qmake概述库引用和库路径指定QT创建动态库和使用小例子写动态库用动态库参考资料附录概述 需要先安装osg&#xff0c;然后再编译安装osgQOpenGL的插件。 其中&#xff0c;osgQOpenGL是OSG嵌入到qt中的一种实现方式&#xff0c;换言之&#xff0c;能够支…

【小学信息技术教资面试】《认识鼠标》教案

1.题目&#xff1a;认识鼠标 2.内容&#xff1a; 3.基本要求&#xff1a; &#xff08;1&#xff09;掌握鼠标的基本操作 &#xff08;2&#xff09;体现学生的主体地位 &#xff08;3&#xff09;多种教学方法结合使用 &#xff08;4&#xff09;配合板书讲解 《认识鼠标》…

C语言学习之路(高级篇)—— 变量和内存分布(下)

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 程序的内存分区模型 1) 内存分区 1.1 运行之前 我们要想执行我们编写的c程序&#xff0c;那么第一步需要对这个程序进行编译。 预处理&#xf…

linux进程替换(简介)

一&#xff1a;什么是进程替换&#xff1f; 定义&#xff1a; 进程替换&#xff0c;是指用一个新进程来替换此时正执行的进程。新进程从头开始执行自己的代码。 例子&#xff1a; 我们有一个父进程A&#xff0c;在父进程A中有一个子进程B 一般来说&#xff0c;子进程是执行…

Redis的数据复制

介绍 Redis 的复制 Redis 的复制功能分为同步&#xff08;sync&#xff09;和命令传播&#xff08;command propagate&#xff09;这两个操作 同步操作用于&#xff0c;将从服务器的数据库状态更新至主服务器当前所处的数据库状态&#xff1b;命令传播操作用于&#xff0c;在…

Java基础1112_包机制_JavaDoc生成文档

目录包机制JavaDoc生成文档方法一方法二包机制 为了更好的组织类&#xff0c;Java提供了包机制&#xff0c;用于区别类名的命名空间&#xff1b; 包语句的语法格式为&#xff1a;package pkg1[. pkg2[. pkg3 …]]&#xff1b; 一般利用公司的域名倒置作为包名&#xff1b;com.b…

二进制搭建k8s集群——部署多master

二进制搭建k8s集群——部署多master二进制搭建k8s集群——部署多master部署master02 节点部署负载均衡在lb01、lb02节点上配置nginx和keepalived两台负载均衡器配置keepalived所有node节点修改配置文件在 master01 节点测试创建pod二进制搭建k8s集群——部署多master 架构说明&…

C~回调函数

还是c的学习啊 一、函数指针 在讲回调函数之前&#xff0c;我们需要了解函数指针。 我们都知道&#xff0c;C语言的灵魂是指针&#xff0c;我们经常使用整型指针&#xff0c;字符串指针&#xff0c;结构体指针等 int *p1; char *p2; STRUCT *p3; //STRUCT为我们定义的结构体…

win10下docker安装

业精于勤荒于嬉&#xff0c;总是与偷懒做斗争。 很多年了&#xff0c;一直不愿做事情&#xff0c;不愿意想事情。 1、安装 Docker Toolbox -- Install on Windows | Docker Documentation http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/DockerToolbox-…

今年你们赚到钱了吗?

峥嵘的2022年&#xff0c;各位程序员们&#xff0c;你们赚到钱了吗&#xff1f; 今天是2022年12月21日&#xff0c;眼看就快过年了&#xff01; 今年你们赚到钱了吗&#xff1f;对于我而言&#xff0c;又是一个"窘迫/囧迫"的穷年&#xff0c;有点心慌慌&#xff0c;有…

windows安装Elasticsearch

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索&#xff0c;具有接近实时的搜索&#xff0c;并支持多租户。Elasticsearch是分布式的&#xff…

纷享销客《华东地区新增长专刊》重磅发布

增长&#xff0c;是企业发展永恒的主题。 纷享销客的使命是用创新科技和行业智慧赋能企业增长。在服务超过5000中大型客户的基础上&#xff0c;我们发现&#xff0c;各行各业从营销端到流通端&#xff0c;再到生产端&#xff0c;已然出现了全渠道、全场景、端到端、一体化融合…

【战“疫”案例展】壹点灵心理服务平台——携手抗疫,共克时艰“星光”同行公益项目...

‍网易云信战“疫”案例本项目由网易云信投递并参与“数据猿行业盘点季大型主题策划活动—— #榜样的力量# 《新冠战“疫”——中国数据智能产业最具社会责任感企业》榜单/奖项”评选。‍数据智能产业创新服务媒体——聚焦数智 改变商业自2019年底以来&#xff0c;人们的情绪持…

电脑垃圾站刚清空的文件怎么找回?总结了三种方法

当电脑上删除文件后会临时存放在电脑垃圾站中&#xff0c;如果还需要这些文件&#xff0c;还能有“后悔药”&#xff0c;直接在电脑垃圾站里面找到进行“还原”即可&#xff0c;但是当垃圾站的文件刚被清空了怎么办&#xff1f;如何找回文件呢&#xff1f;下面分享三种方法恢复…