排序——交换排序

在上篇文章我们详细介绍了排序的概念与插入排序,大家可以通过下面这个链接去看:

排序的概念及插入排序

这篇文章就介绍一下一种排序方式:交换排序。

一,交换排序

基本思想:两两比较,如果发生逆序则交换,直到所有记录都排好序为止。

而交换排序又分为两种:

        冒泡排序O(n2)

快速排序O( nlog2n )

1,冒泡排序

A 基本内容

学习过C语言的朋友应该对这个比较熟悉,其基本思想就是:  

每趟不断将记录两两比较,并按“前小后大” 规则交换

如图进行一次冒泡排序的过程:

21254925*16,  08

212525*1608 49

21251608 25*49

211608 2525*49

1608 212525*49

0816212525*49

 冒泡排序的优点:

每趟结束时,不仅能挤出一个最大值到最后面位置,还能同时部分理顺其他元素; 

    一旦下趟没有交换,还可提前结束排序

在c语言的代码中实际就是通过两个for循环来实现 

void main() 			 
{	int a[11];		/*a[0]不用,之用a[1]~a[10]*/
	int i,j,t;
	printf("\nInput 10 numbers: \n");
	for(i=1;i<=10;i++)	scanf("%d",&a[i]);	printf("\n");
	for(j=1;j<=9;j++)
	    for(i=1;i<=10-j;i++)
	      if(a[i]>a[i+1])	{t=a[i];a[i]=a[i+1];a[i+1]=t;}//交换
	for(i=1;i<=10;i++)	printf("%d ",a[i]);   
}

下面是一个例子 

下面这段代码与上面的区别是,当遇见数组部分有序时,可以提前结束循环,节省不必要的时间。

  1. 定义了一个名为bubble_sort的函数,接受一个顺序表L作为参数。
  2. 初始化变量m为顺序表的长度减1,flag为1,表示是否需要继续排序。
  3. 使用while循环进行排序,条件是m > 0flag == 1。当m等于0时,说明已经遍历完所有元素;当flag为0时,说明在一次循环中没有发生任何交换,说明已经排序完成。
  4. while循环内部,使用for循环遍历顺序表中的元素,从第一个元素到第m个元素。
  5. for循环内部,比较当前元素L.r[j].key和下一个元素L.r[j+1].key的大小。如果当前元素的键值大于下一个元素的键值,则交换这两个元素的位置,并将flag设置为1,表示发生了交换。
  6. 每次循环结束后,将m减1,缩小未排序部分的范围。
  7. while循环结束时,顺序表L中的元素已经按照升序排列。
void bubble_sort(SqList &L)
 { int m,i,j,flag=1;   RedType x;
   m=n-1;
   while((m>0)&&(flag==1))
   {  flag=0;
      for(j=1;j<=m;j++)
         if(L.r[j].key>L.r[j+1].key)
          {  flag=1;
             x=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=x; //交换
           }//endif
      m--;
    }//endwhile
 }

B 冒泡排序的算法分析:

设对象个数为 n 
比较次数 移动次数 与初始排列有关

最好情况下: 只需 1趟排序,比较次数为 n-1,不移动  

while((m>0)&&(flag==1))
   {  flag=0;
      for(j=1;j<=m;j++)
        if(L.r[j].key>L.r[j+1].key)
          {  flag=1;  x=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=x; } 
             ……     

最坏情况下: n-1趟排序,第i趟比较n-i次,移动3(n-i) 

冒泡排序

时间复杂度为 o(n2) 

空间复杂度为 o(1)

是一种稳定的排序方法

2,快速排序

A 基本内容

基本思想:

任取一个元素 ( 如第一个 ) 为中心
所有比它 的元素一律前放,比它 的元素一律后放,形成 左右两个子表
对各子表重新选择 中心 元素并依此规则调整,直到每个子表的元素 只剩一个

 在数组中,我们通过两个指针来实现排序过程

 后面也是一样的操作,我们会发现每趟子表的形成从两头向中间交替式逼近,对各子表操作相似,因此我们可采用递归算法来实现对数据的排序过程。

// 快速排序算法
void main()
{
    QSort(L, 1, L.length); // 对数组L进行快速排序
}

// 快速排序函数,参数为待排序的数组L,起始下标low和结束下标high
void QSort(SqList &L, int low, int high)
{
    if (low < high)
    {
        pivotloc = Partition(L, low, high); // 获取基准元素的位置
        QSort(L, low, pivotloc - 1);       // 对基准元素左边的子数组进行快速排序
        QSort(L, pivotloc + 1, high);      // 对基准元素右边的子数组进行快速排序
    }
}

// 划分函数,参数为待排序的数组L,起始下标low和结束下标high
int Partition(SqList &L, int low, int high)
{
    L.r[0] = L.r[low]; // 将第一个元素作为基准元素
    pivotkey = L.r[low].key;
    while (low < high)
    {
        // 从右向左找到第一个小于基准元素的下标
        while (low < high && L.r[high].key >= pivotkey)
            --high;
        L.r[low] = L.r[high]; // 将找到的元素放到左边

        // 从左向右找到第一个大于基准元素的下标
        while (low < high && L.r[low].key <= pivotkey)
            ++low;
        L.r[high] = L.r[low]; // 将找到的元素放到右边
    }
    L.r[low] = L.r[0]; // 将基准元素放到正确的位置
    return low;        // 返回基准元素的下标
}

 B 快速排序的算法分析:

 最好情况:划分后,左右子序列长度相同

最坏情况:递归树成为单支树 

到此交换排序就结束了, 如果文章对你有用的话请点个赞支持一下吧!

下篇文章将更新选择排序的内容。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 下 redis 集群部署

目录 1. redis下载 2. 环境准备 3. redis部署 3.1 修改系统配置文件 3.2 开放端口 3.3 安装 redis 3.4 验证 本文将以三台服务器为例&#xff0c;介绍在 linux 系统下redis的部署方式。 1. redis下载 下载地址&#xff1a;Index of /releases/ 选择需要的介质下载&am…

【笔记】在虚拟中的主从数据库连接实体数据库成功后的从数据库不同步问题解决方法1

130是主数据库 131是从数据 数据可以说是一点没同步 解决方法; 重新设置主从连接 在虚拟机中mysql账号xiaoming&#xff08;主从数据库的桥梁账号&#xff09;登录 主数据要做的&#xff1a; show master status&#xff1b; 可以发现 这两个值发送了变化 从数据库mysql中…

探索4D毫米波雷达和摄像头在自动驾驶中的潜力

随着自动驾驶技术的快速发展&#xff0c;关于各种传感器的必要性&#xff0c;尤其是LiDAR&#xff08;激光雷达&#xff09;与毫米波雷达结合摄像头的作用&#xff0c;激发了激烈的讨论。在这篇博客中&#xff0c;我们将探讨4D毫米波雷达和摄像头的组合是否可能成为自动驾驶车辆…

一篇学通Axios

Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;用于浏览器和 node.js 环境。它提供了一种简单易用的方式来发送 HTTP 请求&#xff0c;并支持诸如请求和响应拦截、转换数据、取消请求以及自动转换 JSON 数据等功能。 Axios 名字的由来 Axios 的名字来源于希腊神话中的…

高校寻物平台小程序的设计

失主账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;寻物启示管理&#xff0c;失物归还管理&#xff0c;失物认领管理&#xff0c;举报投诉管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;寻物启示&#xff0c;失物招领&#xff0c;公告信息&…

eNsp公司管理的网络NAT策略搭建

实验拓扑图 实验需求&#xff1a; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9&#xff0c;多出口环境基于带…

【Python】爬虫实战01:获取豆瓣Top250电影信息

本文中我们将通过一个小练习的方式利用urllib和bs4来实操获取豆瓣 Top250 的电影信息&#xff0c;但在实际动手之前&#xff0c;我们需要先了解一些关于Http 请求和响应以及请求头作用的一些知识。 1. Http 请求与响应 HTTP&#xff08;超文本传输协议&#xff09;是互联网上…

Unity中一键生成具有身体感知的虚拟人物动作

在虚拟现实(VR)和增强现实(AR)的浪潮中&#xff0c;如何让虚拟人物的动作更加自然、真实&#xff0c;已经成为一个重要课题。AI4Animation项目&#xff0c;一个由 Sebastian Starke 主导的开源框架&#xff0c;为Unity开发者提供了强大的工具集&#xff0c;以实现这一目标。本文…

threadx netxduo stm32f407上实现http server

这次用的是CubeIDE + CubeMX 要把NX_APP的mem分配的大一些,在app_azure_rtos.c中,我给的是40*1024,如果给的不够,会导致后面无法分配pool和thread等等 需要用到filex 要在CubeMX里面勾选上,还要用到http_server和dhcp netxduo/addons/auto_ip at v6.1.11_rel eclipse-th…

AI时代:探索个人潜能的新视角

文章目录 Al时代的个人发展1 AI的高速发展意味着什么1.1 生产力大幅提升1.2 生产关系的改变1.3 产品范式1.4 产业革命1.5 Al的局限性1.5.1局限一:大模型的幻觉 1.5.2 局限二&#xff1a;Token 2 个体如何应对这种改变?2.1 职场人2.2 K12家长2.3 大学生2.4 创业者 3 人工智能发…

怎么安装Manim库在Windows环境下的Jupyter Notebook上

Manim 是解释性数学视频的动画引擎。 您可以使用它来制作数学视频&#xff08;或其他字段&#xff09;。也许你们会在有有些平台上会看过特别好看的数学动画&#xff0c;例如 3Blue1Brown等。这些动画特别好看&#xff0c;还特别丝滑&#xff0c;基本找不到太大的毛病。 我当初…

初步探究Rust生态与图形界面编程

引言 Rust作为一种现代的、安全的系统编程语言&#xff0c;自2010年问世以来&#xff0c;逐渐在开发社区中崭露头角。它的内存安全保证、并发处理能力、以及无需垃圾回收机制的高性能特性&#xff0c;使得它成为了开发系统工具、网络服务、以及嵌入式系统的热门选择。然而&…

20240715 每日AI必读资讯

&#x1f310; 代号“ 草莓 ”&#xff0c;OpenAI 被曝研发新项目&#xff1a;将 AI 推理能力提至新高度 - OpenAI 公司被曝正在研发代号为“ 草莓 ”的全新项目&#xff0c;进一步延伸去年 11 月宣布的 Q* 项目&#xff0c;不断提高 AI 推理能力&#xff0c;让其更接近人类的…

32路串口服务器 应用领域

32路串口服务器在多个领域有着广泛的应用&#xff0c;以下是详细的应用实例&#xff1a; 一、工业自动化 在工业自动化领域&#xff0c;32路串口服务器发挥着举足轻重的作用。传统的工业设备往往采用串口通信方式&#xff0c;而串口服务器能够将这些设备接入网络&#xff0c;…

Nodejs 第八十章(Kafka高级)

kafka前置知识在前几章章讲过了 不再复述 Kafka集群操作 1.创建多个kafka服务 拷贝一份kafka完整目录改名为kafka2 修改配置文件 kafka2/config/server.properties 这个文件 broker.id1 //唯一broker port9093 //切换端口 listenersPLAINTEXT://:9093 //切换监听源启动zooKe…

多表联合的查询(实例)、对于前端返回数据有很多表,可以分开操作、debug调试教程

2024.7.13 一、 对于多表的更深层的认识1. 认识2. 多表联合查询的列子&#xff1a;3. 对于多表查询的进一步认识4. 在实现功能的时候&#xff0c;原本对于省市县这样的表&#xff0c;对于项目的要求&#xff0c;是直接全部查询出来&#xff0c;然后开始使用&#xff0c;但我想着…

Elasticsearch:使用 Amazon Bedrock 的 semantic_text

作者&#xff1a;来自 Elastic Gustavo Llermaly 使用 semantic_text 新功能&#xff0c;并使用 AWS Bedrock 作为推理端点服务。 Elasticsearch 的新 semantic_text 映射类型旨在简化构建 RAG 应用程序的常见挑战。它整合了文本分块、生成嵌入以及检索嵌入的步骤。 在本文中…

C++进阶(while循环——函数应用)

知识点代码框架总结 输入n组数据 &#xff0c;对n组数据里面的每一组进行处理&#xff08;输出、求和 、运算、其他&#xff09; int n;//几组数据cin >> n;//2while(n--){//对每组数据进行处理}看到下面的样例&#xff0c;肌肉型反映出上面的框架//2// 1 2 3// 4 5 6若…

机器学习筑基篇,Jupyter Notebook 精简指南

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 0x00 Jupyter Notebook 简明指南 描述&#xff1a;前面我们已经在机器学习工作站&#xff08;Ubuntu 24.04 Desktop Geforce RTX 4070Ti SUPER&#xff09;中安装 Anaconda 工具包&#xff0c;其…

Oracle23ai 新特性IF [NOT] EXISTS 语法支持

Oracle23ai 新特性IF [NOT] EXISTS Syntax Support 官方文档地址 https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/release-changes.html#GUID-9EE96980-43F9-4068-893E-C191CD83ACA6 IF [NOT] EXISTS 语法支持 CREATE、ALTER和DROP DDL语句支持IF NO…