排序——交换排序

news2024/11/15 12:09:25

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

排序的概念及插入排序

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

一,交换排序

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

而交换排序又分为两种:

        冒泡排序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 快速排序的算法分析:

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

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

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

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

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

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

相关文章

Java | Leetcode Java题解之第234题回文链表

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isPalindrome(ListNode head) {if (head null) {return true;}// 找到前半部分链表的尾节点并反转后半部分链表ListNode firstHalfEnd endOfFirstHalf(head);ListNode secondHalfStart reverseList(firs…

《BASeg: Boundary aware semantic segmentation for autonomous driving》论文解读

期刊&#xff1a;Neural Networks | Journal | ScienceDirect.com by Elsevier 年份&#xff1a;2023 代码&#xff1a;https://github.com/Lature-Yang/BASeg 摘要 语义分割是自动驾驶领域街道理解任务的重要组成部分。现有的各种方法要么专注于通过聚合全局或多尺度上下文…

读人工智能全传12人工智能导致的问题1

1. 人工智能会导致什么问题 1.1. 人工智能是一门通用技术&#xff1a;它的应用仅仅受限于我们的想象 1.1.1. 所有的技术都可能产生意想不到的效果&#xff0c;未来几十年甚至几百年内都存在可能性 1.2. 所有的技术都可能被滥用 1.2.1. 我们的无名氏祖先率先用上了火&#x…

C#统一委托Func与Action

C#在System命名空间下提供两个委托Action和Func&#xff0c;这两个委托最多提供16个参数&#xff0c;基本上可以满足所有自定义事件所需的委托类型。几乎所有的 事件 都可以使用这两个内置的委托Action和Func进行处理。 Action委托&#xff1a; Action定义提供0~16个参数&…

【深度学习】PyTorch深度学习笔记01-Overview

参考学习&#xff1a;B站视频【《PyTorch深度学习实践》完结合集】-刘二大人 ------------------------------------------------------------------------------------------------------- 1. 基于规则的深度学习 2. 经典的机器学习——手动提取一些简单的特征 3. 表示学习…

【接口设计】为 APP、PC、H5 网页提供统一风格的 API(实战篇,附源码地址)

为 APP、PC、H5 网页提供统一风格的 API 1.实现文章实体2.实现数据持久层3.实现服务接口和服务接口的实现类3.1 创建服务接口3.2 编写服务接口的实现 4.处理返回结果4.1 实现响应的枚举类4.2 实现返回的对象实体4.3 封装返回结果 4.统一处理异常4.1 全局捕捉异常4.2 自定义异常…

【防火墙】防火墙安全策略用户认证综合实验

实验拓扑及要求 拓扑搭建及IP配置 防火墙&#xff08;总公司&#xff09;和交换机&#xff08;汇聚生产区和办公区&#xff09;的接口配置 生产区在vlan2&#xff0c;办公区在vlan3&#xff0c;防火墙在G1/0/3接口上创建子接口G1/0/3.1和G1/0/3.2对两个区域分别进行管理 交换…

时间轮算法理解、Kafka实现

概述 TimingWheel&#xff0c;时间轮&#xff0c;简单理解就是一种用来存储若干个定时任务的环状队列&#xff08;或数组&#xff09;&#xff0c;工作原理和钟表的表盘类似。 关于环形队列&#xff0c;请参考环形队列。 时间轮由两个部分组成&#xff0c;一个环状数组&…

企业智能制造赋能的环境条件为什么重要?需要准备什么样的环境?

在全球制造业不断演进的今天&#xff0c;智能制造已经成为推动行业创新和转型的关键力量。它不仅代表了技术的革新&#xff0c;更是企业管理模式和运营思路的全面升级。然而&#xff0c;智能制造的落地实施并非一蹴而就&#xff0c;它需要企业在环境条件上做好充分的准备&#…

Study--Oracle-07-ASM自动存储管理(一)

一、ASM实例和数据库实例对应关系 1、ASM是Oracle 10g R2中为了简化Oracle数据库的管理而推出来的一项新功能&#xff0c;这是Oracle自己提供的卷管理器&#xff0c;主要用于替代操作系统所提供的LVM&#xff0c;它不仅支持单实例&#xff0c;同时对RAC的支持也是非常好。ASM可…

C语言 | Leetcode C语言题解之第231题2的幂

题目&#xff1a; 题解&#xff1a; const int BIG 1 << 30;bool isPowerOfTwo(int n) {return n > 0 && BIG % n 0; }

防火墙--NAT和智能选路的一些知识

目录 NAT 源NAT 包含 目标NAT 包含 双向NAT 防火墙中web页面的nat配置 新建NAT策略 各个选项意思及使用 NAT类型 转换模式 仅转换源地址选项 原始数据包就相当于抓取流量&#xff0c;相当于NAT中acl的配置 转换后的数据包就是转换后的公网地址 配置地址池 端口地…

低代码商城构建专家:Mall-Cook

Mall-Cook&#xff1a;用Mall-Cook&#xff0c;让电商创新触手可及- 精选真开源&#xff0c;释放新价值。 概览 Mall-Cook是一个面向未来的商城低代码开发平台&#xff0c;它通过提供直观的可视化界面&#xff0c;让开发者和商家能够快速构建和部署跨平台的电商解决方案。这个…

国产精品ORM框架-SqlSugar详解 进阶功能 集成整合 脚手架应用 专题二

国产精品ORM框架-SqlSugar详解 SqlSugar初识 专题一-CSDN博客 sqlsugar 官网-CSDN博客 4、进阶功能 5、集成整合 6、脚手架应用 4、进阶功能 4.1、生命周期 Queryable 什么时候操作库 Queryable是一个引用类型 Queryable拷贝机制 4.2、执行Sql 方法列表 方法名 描述 返…

秋招Java后端开发冲刺——MyBatisPlus总结

一、 基本知识 1. 介绍 yBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上增加了大量功能和简化操作&#xff0c;以提高开发效率。 2. 特点 无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有项目产生影响。依赖少&#xff1a;仅仅依赖 …

智慧校园信息化大平台整体解决方案PPT(75页)

1. 教育信息化政策 教育部印发《教育信息化2.0行动计划》&#xff0c;六部门联合发布《关于推进教育新型基础设施建设构建高质量教育支撑体系的指导意见》&#xff0c;中共中央、国务院印发《中国教育现代化2035》。这些政策文件强调了教育的全面发展、面向人人、终身学习、因…

Linux对文件访问的基本权限

文件权限控制对文件的访问。 有三种权限类别可应用&#xff1a;读取、写入和执行。 权限对文件和目录的影响&#xff1a; 权限 对文件的影响 对目录的影响 r读取 可以读取文件的内容 可以列出目录的内容 w写入 可以更改文件的内容 可以创建或删除目录中任一文件 x执行…

uniapp 支付宝小程序 芝麻免押 免押金

orderStr参数如下&#xff1a; my.tradePay({orderStr:res, // 完整的支付参数拼接成的字符串&#xff0c;从 alipay.fund.auth.order.app.freeze 接口获取success: (res) > {console.log(免押成功);console.log(JSON.stringify(res),不是JOSN);console.log(JSON.stringify…

ClickHouse 查看表的大小

查看表的大小&#xff1a; 使用以下查询语句可以列出表及其占用的磁盘空间大小&#xff1a; SELECTtable,formatReadableSize(sum(bytes_on_disk)) AS size_on_disk FROM system.parts WHERE active GROUP BY table ORDER BY size_on_disk DESC

部署一台本机的ai智能模型

部署ai模型 1.打开地址搜 https://ollama.com/&#xff08;开源ai模型网址&#xff09;下载软件 2.点击安装具有羊驼图标的文件 3.在右下角查看 羊驼图标 4。打开脚本&#xff0c;执行可以切换羊驼安装的位置与环境变量 5.winR 输入cmd,在命令窗口输入ollama命令 如果安装成功…