快速排序与冒泡排序以及代码

news2024/12/26 21:35:06

快速排序

快速排序(Quicksort)是一种常用的排序算法,它基于分治的思想。
时间复杂度:O(nlogn)
空间复杂度:O(logn)

快速排序的基本思想如下:

  1. 选择一个元素作为基准(pivot)。
  2. 将序列中比基准小的元素移到基准的左边,比基准大的元素移到基准的右边。这个过程称为划分(partition)。
  3. 对划分后的两个子序列(基准左边和右边的序列)递归地应用上述步骤,直到子序列的长度为1或0,也即序列已经有序。
  4. 合并所有子序列的结果,得到最终的排序序列。

在这里插入图片描述
代码参考这篇文章:

void Quick_Sort(int *arr, int begin, int end) {
	if (begin > end) {     //当待排序的子数组长度为0或负数时,终止递归 
		return;
	}
	int tmp = arr[begin];  //取数组的第一个元素arr[begin]作为基准元素
	int i = begin;
	int j = end;
	while(i != j) {  	   //指针i和j分别从数组的两端向中间移动,寻找可以交换的元素
		while(arr[j] >= tmp && j > i)
			j--;
		while(arr[i] <= tmp && j > i)
			i++;
		if(j > i) {  
			int t = arr[i];
			arr[i] = arr[j];
			arr[j] = t;
		}
	}
	arr[begin] = arr[i];
	arr[i] = tmp;       //将基准元素放在最终位置
	Quick_Sort(arr, begin, i-1);
	Quick_Sort(arr, i+1, end); 
} 

冒泡排序

冒泡排序是一种简单但效率较低的排序算法。它通过多次交换相邻元素的位置来实现排序。下面是冒泡排序的具体过程:

1.从数组的第一个元素开始,比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。
2.继续比较下一对相邻元素,重复上述比较和交换操作,直到遍历到倒数第二个元素。
3.重复执行步骤 1 和步骤 2,直到所有元素都被比较并排序。
这样,每一轮遍历都会将未排序部分的最大(或最小)元素移动到已排序部分的末尾。因此,经过多轮遍历后,整个数组就会按照升序(或降序)排列。

写代码时有个细节要注意: for (int i = 0; i < size - 1; i++) {

#include <iostream>
using namespace std;

void bubbleSort(int arr[], int size) {
    for (int i = 0; i < size - 1; i++) { //size-1  而非size 因为要arr[j+1]
        for (int j = 0; j < size - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换 arr[j] 和 arr[j + 1] 的值
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() {
    int arr[] = {5, 2, 8, 12, 1};
    int size = sizeof(arr) / sizeof(arr[0]);  //sizeof(arr) 表示整个数组 arr 在内存中占用的总字节数。sizeof(arr[0]) 表示数组 arr 中单个元素 arr[0] 的字节大小。

    cout << "排序前的数组:";
    for (int i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }

    bubbleSort(arr, size);

    cout << "\n排序后的数组:";
    for (int i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

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

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

相关文章

ffmpeg+flv视频推拉流实现(demo版)

前言 工作需要&#xff0c;记录一下前后端推拉流方案&#xff0c;基于HTTP-FLV协议&#xff0c;使用node flv.js ffmpeg进行前后端交互。 此方案为demo版&#xff0c;目的是打通前后端链路&#xff0c;项目应用正在研究中。 步骤 1.安装ffmpeg 后端推流需要借助ffmpeg流媒…

centos7 添加网卡设置动态ip,修改网卡为任意名称

centos7 添加网卡并设置动态ip&#xff0c;重命名为任意名称 本文记录如何在centos环境上增加两个网卡&#xff0c;并设置为动态获取ip&#xff0c;以及修改网卡名称为任意名称 1、centos7添加两个网卡动态获取ip 1.1 vmvare上添加网络适配器 1、关闭虚拟机 2、 添加网络适…

Linux:修改mvn命令使用的maven路径

要在 Linux 上更改 Maven 的版本&#xff0c;需要调整 PATH 环境变量以指向所需版本的 Maven 安装目录。 打开终端或命令行界面。 使用文本编辑器打开 /etc/profile 文件&#xff1a; vi /etc/profile在文件的末尾添加以下行&#xff0c;将 PATH 环境变量指向新的 Maven 安装目…

torch.sum()——dim参数

dim指在dim的这个维度上&#xff0c;对tesnor 进行求和&#xff0c;如果keepdim&#xff08;保持维度&#xff09;False&#xff0c;返回结果会删去dim所指的这个维度。以下面的例子分析dim的参数~ torch.tensor([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) print(…

【高级数据结构C++】树的重心——教父POJ 3107(链式前向星的使用)

》》》算法竞赛 /*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在竞赛算法学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记&#xff1a;转载…

【新版】系统架构设计师 - 案例分析 - 架构设计<Web架构>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 架构设计&#xff1c;Web架构&#xff1e;Web架构知识点单台机器 到 数据库与Web服务器分离应用服务器集群负载均衡负载均衡技术静态与动态算法Session共享机制有状态与无状态 持久化技…

D2538A 是一块带有 ALC 的单通道前置放大器。它适用于立体声收 录机和盒式录音机。采用 SOP8 及 SOT23-6 的封装形式封装。

D2538A 是一块带有 ALC 的单通道前置放大器。它适用于立体声收 录机和盒式录音机。采用 SOP8 及 SOT23-6 的封装形式封装。 主要特点&#xff1a; ● 带内置 ALC 回路的单通道均衡放大器。 ● 低噪声&#xff1a; VNI1.0V&#xff08;典型值&#xff09;。 ● 开环电压增…

数据库信息速递: Oracle 23C 引入了向量搜索功能,为生成式人工智能应用提供支持 (译)...

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友…

优化 Node.js 性能:检测内存泄漏和高 CPU 使用率

优化 Node.js 性能&#xff1a;检测内存泄漏和高 CPU 使用率 Node.js 是一种流行的 JavaScript 运行时&#xff0c;以其速度、性能和可扩展性而闻名。然而&#xff0c;即使是优化和编写得非常好的 Node.js 应用程序也可能会遇到性能问题&#xff0c;例如内存泄漏和 CPU 使用率…

4K视频一分钟大小是多少?如何转换为其他分辨率?

4K 分辨率是指大约 4,000像素的水平显示分辨率&#xff0c; 4K显示器、电视的分辨率为3840*2160&#xff1b;影院的4K分辨率为40962160。4K视频相较于常见的1080P分辨率更清晰、画面更流畅&#xff0c;然而与之对应的则是文件更大&#xff0c;更占用本地存储内存&#xff0c;在…

距离矢量路由协议RIP(含Cisco模拟器实验命令配置)

距离矢量路由协议RIP(含Cisco模拟器实验命令配置) 简介 距离矢量路由协议&#xff08;Routing Information Protocol, RIP&#xff09;是一种内部网关协议&#xff0c;它位于应用层&#xff0c;使用520 UDP端口。RIP基于距离矢量算法&#xff08;Bellham-Ford&#xff09;根据…

数据探索的新前沿:可视化大屏交互功能

在当今数字化时代&#xff0c;数据和信息是企业成功的关键。可视化大屏已经成为各个行业中数据呈现和决策支持的重要工具。然而&#xff0c;随着技术的发展&#xff0c;用户对于数据可视化的期望也在不断演变。仅仅呈现数据已经不再足够&#xff0c;用户希望能够更深入地与数据…

buildroot中将编译好的库(Qt,tslib)放入嵌入式linux文件系统

首先交叉编译想使用版本的Qt源码&#xff0c;还有tslib库&#xff0c;编译好之后 再次编译buildroot&#xff0c;再编译好的buildroot中会出现output文件夹&#xff0c;然后output文件夹下有target文件夹&#xff0c;这个target文件夹就是将要打包的文件系统&#xff0c;目标目…

Cloudflare分析第二天:解密返回数据

前言 Cloudflare分析第一天&#xff1a;简单的算法反混淆 由上篇for (j "10|8|5|9|1|4|0|2|3|6|7"["split"](|) 可以看到循环的循序 case 6:o (n {},n["msg"] f,n.cc g,hF["VNwzz"](JSON["stringify"](n))["re…

多线程和并发编程(6)—并发编程的设计模式

优雅终止 如何优雅终止线程&#xff1f; 中断线程的思路是使用两阶段法&#xff1a;第一阶段发生中断请求&#xff0c;第二阶段根据中断标识结束线程&#xff1b; public class Test1 {private volatile static boolean interrupted false;public static void main(String[…

生信教程:使用全基因组SNP数据进行ABBA-BABA分析

动动发财的小手&#xff0c;点个赞吧&#xff01; 简介 ABBA BABA 统计&#xff08;也称为“D 统计”&#xff09;为偏离严格的分叉进化历史提供了简单而有力的测试。因此&#xff0c;它们经常用于使用基因组规模的 SNP 数据&#xff08;例如来自全基因组测序或 RADseq&#xf…

monkeyrunner环境搭建和初步用法

一、打开模拟器 运行monkeyrunner之前必须先运行相应的模拟器&#xff0c;不然monkeyrunner无法连接设备。 用Elipse打开Android模拟器或在CMD中用Android命令打开模拟器。这里重点讲一下在CMD中用Android命令打开模拟器 命令&#xff1a;emulator -avd test &#xff08;注…

使用ElementUI结合Vue完善主页的导航菜单和书籍管理以及后台数据分页查询

目录 动态树 数据表 案列 书籍管理 动态树 动态树&#xff08;Dynamic tree&#xff09;是一种数据结构&#xff0c;它可以在树中动态地插入、删除和修改节点。与静态树不同&#xff0c;静态树的节点是固定的&#xff0c;一旦构建完成就无法再进行修改。而动态树可以在运行时…

中间件 - 分布式协调服务Zookeeper

目录 一. 前言 二. 树状结构 2.1. ZNode 2.1.1. stat 2.1.2. ACL 三. NameService命名服务 四. Configuration 配置管理 五. GroupMembers 集群管理 六. 集群三个角色及状态 七. 选举算法 八. Watcher 九. 设计目的 十. 典型使用场景 一. 前言 Zookeeper是一个分布…

Learn Prompt- Midjourney案例:Logo设计

Logo设计是一个充满挑战的任务&#xff0c;因为Logo是品牌重要价值的浓缩。 快速开始​ 直接使用logo design for...来获取灵感。 备注 图像中生成文字在Midjourney中的效果还不是很好&#xff0c;但你可以用Canva编辑图片并替换自己的文字。 在提示中使用那些擅长你所寻找的…