浅谈排序算法(冒泡,插入,归并)

对于数据的排序,有多种方法,对应这不同的时间复杂度(效率不同)。

​一、冒泡排序(Bubble Sort)

        冒泡排序(Bubble Sort)是一种简单的排序算法。

         算法思路:

               1. 从第一对相邻数据开始到最后一组相邻数据比较,两两依次比较,最后一组数据结束时,数组 下标n对应的数即为最大数

                2.重复上述操作,直至下标为n-1 (下标为n的数已经是最大的,不需要重复操作)

                3.最后重复操作直至不需要再比较任意一对数(即总共进行n次)

        时间复杂度 O(x^{2})

        图示(省略比较不交换的操作):

 冒泡排序代码:

#include<cstdio>
#include<iostream>
using namespace std;
int a[1001];
int n;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n-i;j++)
	{
		if(a[j]>a[j+1]) swap(a[j],a[j+1]); 
	}
	for(int i=1;i<=n;i++) printf("%d ",a[i]);
	return 0;
}

 二、插入排序(Insert sort)

       插入排序很好理解,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

        算法思路:

                1.默认第一个元素为已排序序列

                ​2.取出下一个元素,在已排序序列中从后向前扫描

​                3.如果该元素(已排序)大于新元素,将该元素移到下一位置(前移一位)

​                4.重复操作3,直到找到已排序的元素小于或者等于新元素的位置,并将新元素插入到该位置后

                5.重复2~4操作,直至对最后一个元素插入操作结束。

            时间复杂度:O(x^{2})

 关键操作:步骤3 从后向前扫描 以上图④为例

代码实现插入排序: 

#include<cstdio>
#include<iostream>
using namespace std;
int a[1001];
int n;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<n;i++)
	{
		for(int j=i+1;j>=1;j--)
			if(a[j]<a[j-1]) swap(a[j],a[j-1]);
	}
	for(int i=1;i<=n;i++) printf("%d ",a[i]);
	return 0;
}

三、归并排序(Merge sort)

        归并排序(Merge sort)是一种采用分治法的排序方法,将已有的子序列合并,合并成一个有

序的新序列。时间复杂度:O(nlogn)

        算法思路(分支法):

        1.分:将原序列分成相应的子序列(二分方法)。时间复杂度为 O(logn ),相比上述两种排序方法的效率大大提高,因此更适合数据范围更大的情况。            

        

// “分”的伪代码
void merge(int l,int r)
{
    int mid=l+(r-l)/2; // 二分
    if(l<r)
    {
	  	merge(l,mid); 
	    merge(mid+1,r);
	    merge_sort(l,mid,r); // 并
	}
}

         2.并:将分的子序列合并成一个新的有序数列(合并的过程是线性的,时间复杂度为O(n)

        

        “并”的过程思路很简单,但与递归结合代码实现较难

           将 [ l , r ] [ mid+1 , r ] 的序列合并,采用线性方法,如图所示:

从两个序列的第一个数一次比较,取出较小的数放入新的有序数组,然后再将新数组赋值到原来的数组中。

void merge_sort(int l,int mid,int r) // 将[l,mid]与[mid+1,r]的序列合并
{
    int i=l,j=mid+1,k=l;
    while(i!=mid+1 && j!=r+1) // 采用线性的方法
    {
        if(a[i]>a[j]) 
        {
            b[k++]=a[j];
            j++;
        }
        else 
        {   
            b[k++]=a[i];
            i++;
        }
    }
	while(i!=mid+1) b[k++]=a[i++]; // 将剩下未被完全取出的序列依次取出放入新数组
    while(j!=r+1) b[k++]=a[j++];
    for(int i=l;i<=r;i++) a[i]=b[i];
}

 一个关于归并排序的思考:

                归并过程通过将两个序列合并成一个有序数列,需要通过比较两个序列首端的元素大小,并依次取出,这个过程是线性的,需要保证这两个序列也是有序的,但这两个序列会不会有序呢?为什么有序呢?

        通过每次递归加上不断重复更新原数组,保证每次并的过程结果都会是有序的,所以当合并两个序列是,这两个序列也是有序的。

        

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

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

相关文章

利用 Python 抓取数据探索汽车市场趋势

一、引言 随着全球对环境保护意识的增强和技术的进步&#xff0c;新能源汽车作为一种环保、高效的交通工具&#xff0c;正逐渐受到人们的关注和青睐。在这个背景下&#xff0c;对汽车市场的数据进行分析和研究显得尤为重要。 本文将介绍如何利用 Python 编程语言&#xff0c;结…

扭蛋机小程序开发,线上扭蛋机成为市场发展主流?

近几年以来&#xff0c;潮玩市场一直处于领先状态&#xff0c;市场规模逐渐扩大。在潮玩行业中&#xff0c;除了盲盒&#xff0c;受到各大群体喜欢的就是扭蛋机了&#xff0c;它因为价格低、品类多样、收藏价值高的优势吸引了各个群体的消费者。 当下&#xff0c;线上用户体量…

基于springboot + vue实现的前后端分离-在线旅游网站系统(项目 + 论文)

项目介绍 本旅游网站系统采用的数据库是MYSQL &#xff0c;使用 JSP 技术开发&#xff0c;在设计过程中&#xff0c;充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 技术选型 后端: SpringBoot Mybatis 数据库 : MyS…

★【二叉搜索树】【中序遍历+前后指针】Leetcode 530. 二叉搜索树的最小绝对差

★【二叉搜索树】【中序遍历前后指针】Leetcode 530. 二叉搜索树的最小绝对差 解法1 笨方法 中序遍历转化为有序数组之后遍历解法2 记忆一下&#xff01;&#xff01;&#xff01;需要用一个pre节点记录一下cur节点的前一个节点 遇到在二叉搜索树上求什么最值&#xff0c;求差…

一篇教会你升级GPT-4,内附详细步骤(24年3月最新)

先介绍一下 GPT 升级 第一种: 支付宝购买礼品卡给美区 Apple ID 充值 第二种&#xff1a;3分钟快速升级方法&#xff08;一键升级&#xff09; GPT4的作用非常强大&#xff0c;还可以使用DALL进行绘画&#xff0c;比如我画一个小王子的插画&#xff1a; 平时用DALL绘画是比较…

事物

概述&#xff1a; 数据库的事务&#xff08;Transaction&#xff09;是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令。 事务把所有的命令作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么同时成功&#xff0c;要么同时失败。 事…

SpringCloud搭建微服务之Consul服务配置

1. 概述 前面有介绍过Consul既可以用于服务注册和发现&#xff0c;也可以用于服务配置&#xff0c;本文主要介绍如何使用Consul实现微服务的配置中心&#xff0c;有需要了解如何安装Consul的小伙伴&#xff0c;请查阅SpringCloud搭建微服务之Consul服务注册与发现 &#xff0c…

Ubuntu系统使用Docker搭建Jupyter Notebook并实现无公网ip远程连接

文章目录 1. 选择与拉取镜像2. 创建容器3. 访问Jupyter工作台4. 远程访问Jupyter工作台4.1 内网穿透工具安装4.2 创建远程连接公网地址4.3 使用固定二级子域名地址远程访问 本文主要介绍如何在Ubuntu系统中使用Docker本地部署Jupyter Notebook&#xff0c;并结合cpolar内网穿透…

用GGUF和Llama.cpp量化Llama模型

用GGUF和Llama .cpp量化Llama模型 什么是GGML如何用GGML量化llm使用GGML进行量化NF4 vs. GGML vs. GPTQ结论 由于大型语言模型&#xff08;LLMS&#xff09;的庞大规模&#xff0c;量化已成为有效运行它们的必要技术。通过降低其权重的精度&#xff0c;您可以节省内存并加快推理…

JavaScript数据类型 检测数据类型 数据类型转换 数值相等比较

数值相等比较 JavaScript 提供三种不同的值比较运算&#xff1a; ——严格相等&#xff08;三个等号&#xff09; ——宽松相等&#xff08;两个等号&#xff09; 8种数据类型 前七种为基础数据类型。 Object类型为引用数据类型。 数据类型概念以及存储方式 let a {name:…

MySQL:常用的SQL语句

提醒&#xff1a;设定下面的语句是在数据库名为 db_book执行的。 一、创建表 1. 创建t_booktype表 USE db_book; CREATE TABLE t_booktype(id INT AUTO_INCREMENT, bookTypeName VARCHAR(20),bookTypeDesc varchar(200),PRIMARY KEY (id) );2. 创建t_book表 USE db_book; C…

开源BLHELI-S 代码详细解读(五)

我们继续来看calc_next_comm_timing, 每次操作完换相之后&#xff0c;这里都会调用&#xff0c;同时会设置timer3去等advance timing. 总体思想是根据电机运行状态计算前4次换相时间&#xff0c;然后根据前4次换相时间计算15度和7.5度电角度时间&#xff0c;换相之后延时7.5度…

MYSQL C++链接接口编程

使用MYSQL 提供的C接口来访问数据库,官网比较零碎,又不想全部精读一下,百度CSDN都是乱七八糟的,大部分不可用 官网教程地址 https://dev.mysql.com/doc/connector-cpp/1.1/en/connector-cpp-examples-connecting.html 网上之所以乱七八糟,主要是MYSQL提供了3个接口两个包,使用…

输入一个字符串,将其中的数字字符移动到非数字字符之后

输入一个字符串&#xff0c;将其中的数字字符移动到非数字字符之后&#xff0c;并保持数字字符贺非数字字符输入时的顺序。 代码&#xff1a; #include <cstdio> #include <queue> using namespace std; int main() {char str[200];fgets(str, 200, stdin);//读入…

【详识JAVA语言】输入输出

输出到控制台 基本语法 System.out.println(msg); // 输出一个字符串, 带换行System.out.print(msg); // 输出一个字符串, 不带换行System.out.printf(format, msg); // 格式化输出 println 输出的内容自带 \n, print 不带 \n printf 的格式化输出方式和 C 语言的 printf 是基…

UE蓝图 编译过程详解

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 UE蓝图 返回结果(FunctionResult)节点和源码 UE蓝图 函数调用(CallFunction)节点和源码 UE蓝图 序列(Sequence)节点和源…

BUUUCTF---LSB1

1.题目描述&#xff08;提示lsb&#xff09; 2.下载附件是一张图片 3.在010编辑器中查看没有发现什么信息&#xff0c;再看属性也没有什么有用的信息&#xff0c;根据题目提示lsb想到用Stegsolve这个工具 4.在该工具中打开图片 5.先将红绿蓝三种颜色的通道设置成0&#xff0c;…

如何使用Potplayer远程访问本地群晖NAS搭建的WebDAV中的本地资源

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是&#xff1a;1 使用环境要求&#xff1a;2 配置webdav3 测试局域网使用potplayer访问webdav3 内网穿透&#xff0c;映射至公网4 使用固定地址在potplayer访问webdav ​ 国内流媒体平台的内…

Spring八股 常见面试题

什么是Spring Bean 简单来说&#xff0c;Bean 代指的就是那些被 IoC 容器所管理的对象。我们需要告诉 IoC 容器帮助我们管理哪些对象&#xff0c;这个是通过配置元数据来定义的。配置元数据可以是 XML 文件、注解或者 Java 配置类。 将一个类声明为 Bean 的注解有哪些? Com…

什么是虚拟DOM,有什么作用?有了解过diff算法吗?

虚拟DOM&#xff08;Virtual DOM&#xff09;&#xff1a; 虚拟DOM是一个轻量级的JavaScript对象&#xff0c;它是真实DOM&#xff08;Document Object Model&#xff09;的抽象表示。开发者通过操作这个JavaScript对象来描述视图层的状态&#xff0c;当这个状态发生变化时&…