排序——交换排序

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

排序的概念及插入排序

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

一,交换排序

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

而交换排序又分为两种:

        冒泡排序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; //交换}//endifm--;}//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.mzph.cn/web/44835.shtml

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

相关文章

jenkins系列-09.jpom构建java docker harbor

本地先启动jpom server agent: /Users/jelex/Documents/work/jpom-2.10.40/server-2.10.40-release/bin jelexjelexxudeMacBook-Pro bin % sh Server.sh start/Users/jelex/Documents/work/jpom-2.10.40/agent-2.10.40-release/bin jelexjelexxudeMacBook-Pro bin % ./Agent.…

达梦数据库的系统视图v$sessions

达梦数据库的系统视图v$sessions 达梦数据库&#xff08;DM Database&#xff09;是中国的一款国产数据库管理系统&#xff0c;它提供了类似于Oracle的系统视图来监控和管理数据库。V$SESSIONS 是达梦数据库中的一个系统视图&#xff0c;用于显示当前数据库会话的信息。 以下…

全自主巡航无人机项目思路:STM32/PX4 + ROS + AI 实现从传感融合到智能规划的端到端解决方案

1. 项目概述 本项目旨在设计并实现一款高度自主的自动巡航无人机系统。该系统能够按照预设路径自主飞行&#xff0c;完成各种巡航任务&#xff0c;如电力巡线、森林防火、边境巡逻和灾害监测等。 1.1 系统特点 基于STM32F4和PX4的高性能嵌入式飞控系统多传感器融合技术实现精…

MYSQL--第八次作业

MYSQL–第八次作业 一、备份与恢复 环境搭建&#xff1a; CREATE DATABASE booksDB; use booksDB;CREATE TABLE books ( bk_id INT NOT NULL PRIMARY KEY, bk_title VARCHAR(50) NOT NULL, copyright YEAR NOT NULL );CREATE TABLE authors ( auth_id INT NOT NULL PRI…

geoServer在windows中下载安装部署详细操作教程

这里写目录标题 1.安装环境检查2.下载安装包&#xff08;1&#xff09;进入下载地址&#xff1a;&#xff08;2&#xff09;以下载最新版为例&#xff0c;点击“Stable GeoServer”下载&#xff08;3&#xff09;安装有两种方式&#xff08;4&#xff09;我这里选择下载war包 3…

python作业三

1.使用requests模块获取这个json文件http://java-api.super-yx.com/html/hello.json 2.将获取到的json转为dict 3.将dict保存为hello.json文件 4.用io流写一个copy(src,dst)函数,复制hello.json到C:\hello.json import json import shutilimport requests #使用requests模块获…

Qt MV架构-视图类

一、基本概念 在MV架构中&#xff0c;视图包含了模型中的数据项&#xff0c;并将它们呈现给用户。数据项的表示方法&#xff0c;可能和数据项在存储时用的数据结构完全不同。 这种内容与表现分离之所以能够实现&#xff0c;是因为使用了 QAbstractItemModel提供的一个标准模…

基于JavaSpringBoot+Vue+uniapp微信小程序校园宿舍管理系统设计与实现

基于JavaSpringBootVueuniapp微信小程序实现校园宿舍管理系统设计与实现 目录 第一章 绪论 1.1 研究背景 1.2 研究现状 1.3 研究内容 第二章 相关技术介绍 2.1 Java语言 2.2 HTML网页技术 2.3 MySQL数据库 2.4 Springboot 框架介绍 2.5 VueJS介绍 2.6 ElementUI介绍…

基于大语言模型(LLM)的合成数据生成、策展和评估的综述

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

【JVM实战篇】内存调优:内存泄露危害+内存监控工具介绍+内存泄露原因介绍

文章目录 内存调优内存溢出和内存泄漏内存泄露带来什么问题内存泄露案例演示内存泄漏的常见场景场景一场景二 解决内存溢出的方法常用内存监控工具Top命令优缺点 VisualVM软件、插件优缺点监控本地Java进程监控服务器的Java进程&#xff08;生产环境不推荐使用&#xff09; Art…

【图解大数据技术】流式计算:Spark Streaming、Flink

【图解大数据技术】流式计算&#xff1a;Spark Streaming、Flink 批处理 VS 流式计算Spark StreamingFlinkFlink简介Flink入门案例Streaming Dataflow Flink架构Flink任务调度与执行task slot 和 task EventTime、Windows、WatermarksEventTimeWindowsWatermarks 批处理 VS 流式…

如何查找电脑的MAC地址

一. 什么是mac地址&#xff1f; mac地址本质上帮助我们连接到我们遇到的大多数本地网络。每个网络适配器通常由网络接口​​控制器(NIC) 制造商分配一个唯一的 mac 地址。 二. 如何查找mac地址 1.点击网络和Internet设置 2.点击WLAN点击硬件属性 3.即可查看mac地址

智慧城市3d数据可视化系统提升信息汇报的时效和精准度

在信息大爆炸的时代&#xff0c;数据的力量无可估量。而如何将这些数据以直观、高效的方式呈现出来&#xff0c;成为了一个亟待解决的问题。为此&#xff0c;我们推出了全新的3D可视化数据大屏系统&#xff0c;让数据“跃然屏上”&#xff0c;助力您洞察先机&#xff0c;决胜千…

pytorch训练的时候 shm共享内存不足,导致训练停止

1.查看shm情况 df -h /dev/shm内存已经满了&#xff0c;因为之前训练多次训练意外停止到shm中的缓存不能及时被清理 2、手动清理shm 依然没被释放 3、查看关联的进程&#xff0c;一个一个kill lsof |grep deletedkill -9 46619 44618 44617 。。。。。4、搞定

ROS2 + 科大讯飞 初步实现机器人语音控制

环境配置&#xff1a; 电脑端&#xff1a; ubuntu22.04实体机作为上位机 ROS版本&#xff1a;ros2-humble 实体机器人&#xff1a; STM32 思岚A1激光雷达 科大讯飞语音SDK 讯飞开放平台-以语音交互为核心的人工智能开放平台 实现步骤&#xff1a; 1. 下载和处理科大讯飞语音模…

Dataset for Stable Diffusion

1.Dataset for Stable Diffusion 笔记来源&#xff1a; 1.Flickr8k数据集处理 2.处理Flickr8k数据集 3.Github&#xff1a;pytorch-stable-diffusion 4.Flickr 8k Dataset 5.dataset_flickr8k.json 1.1 Dataset 采用Flicker8k数据集&#xff0c;该数据集有两个文件&#xff…

前端工程化10-webpack静态的模块化打包工具之各种loader处理器

9.1、案例编写 我们创建一个component.js 通过JavaScript创建了一个元素&#xff0c;并且希望给它设置一些样式&#xff1b; 我们自己写的css,要把他加入到Webpack的图结构当中&#xff0c;这样才能被webpack检测到进行打包&#xff0c; style.css–>div_cn.js–>main…

Flower花所比特币交易及交易费用科普

在加密货币交易中&#xff0c;选择一个可靠的平台至关重要。Flower花所通过提供比特币交易服务脱颖而出。本文将介绍在Flower花所进行比特币交易的基础知识及其交易费用。 什么是Flower花所&#xff1f; Flower花所是一家加密货币交易平台&#xff0c;为新手和资深交易者提供…

【C++】开源:drogon-web框架配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍drogon-web框架配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;…

Linux系统编程-线程同步详解

线程同步是指多个线程协调工作&#xff0c;以便在共享资源的访问和操作过程中保持数据一致性和正确性。在多线程环境中&#xff0c;线程是并发执行的&#xff0c;因此如果多个线程同时访问和修改共享资源&#xff0c;可能会导致数据不一致、竞态条件&#xff08;race condition…