排序(6)——冒泡排序、计数排序

七、冒泡排序

1.简介

        冒泡排序可以说是我们的老朋友了,是一种很简单的排序方法。冒泡就是泡泡在水中向上漂,很形象的名字和贴合它的思路,通过一趟趟的冒泡每一次将最大的元素冒到最后的位置处,这样就完成了数据的排序。

2.思路与代码

        冒泡排序无需多言,就是比较相邻元素大小,将较大者不断后移。我们在以前的博客中介绍过冒泡排序,http://t.csdnimg.cn/sB0Yp,有需要可以去瞧瞧哈

void BubbleSort(int* a, int n)
{for (int j = 0; j < n; j++){bool flag = true;for (int i = 0; i < n - 1 - j; i++){if (a[i] > a[i + 1]){swap(&a[i], &a[i + 1]);flag = false;}}if (flag){break;}}
}

3.复杂度与稳定性分析

(1)时间复杂度

        冒泡排序时间复杂度不难计算,由于我们加入了flag作为判断,所以当为顺序的情况时只需要遍历一遍,其时间复杂度是O(n)。而逆序是最差情况,是个标准的等差数列,时间复杂度为O(n^2)

        一般认为冒泡排序的时间复杂度是O(n^2)

(2)空间复杂度

        冒泡排序没有使用额外的空间,其空间复杂度为O(1)

(3)稳定性

        冒泡排序是稳定的。

        冒泡排序比较相邻元素并进行交换,这就意味着相对位置在前的元素想要换到相对位置在后的元素后面,必须要越过这个靠后的元素,即二者一定会存在比较。只需要限定一下当一次比较时二者相等不进行交换,这样就可以保证稳定性。

八、计数排序

1.简介

        计数排序给我的感觉就是众多排序算法中的民间高手。虽然方法不入流,适用范围不广,但是架不住它真的快。排序算法简单说就是统计所有数据出现的次数,然后根据统计的次数从小到大再将数据依次输出。说它不入流是因为我感觉计数排序并非真正的排序,这种统计次数再输出的方式并不是对于原数组进行数据的处理,这也就注定了它的适用范围并不会很广。计数排序只能用于数据跨度较小的整数排序上。

2.思路与代码

        计数排序使用一个计数数组来记录数组过程中各个元素出现的次数,计数数组的下标代表着各种值,下标位置存储的数据则是出现次数。

        为了节约空间与拓展统计区间,我们一般会先遍历数组找到最大值和最小值。根据这个最大值和最小值得到所需要统计数据的区间,并以此为依据进行数组开辟。同时可以将最小值设置为偏移量,根据最小值的大小确定数组0下标位置存储的数据是谁的。

        之后再遍历数组进行计数,然后再遍历计数数组进行数据写出即可。

void CountSort(int* a, int n)
{//找到偏移量int min = a[0], max = a[0];for (int i = 0; i < n; i++){if (a[i] < min){min = a[i];}if (a[i] > max){max = a[i];}}int range = max - min + 1;int* cou = (int*)calloc(range, sizeof(int));if (cou == NULL){perror("calloc fail");return;}//计数for (int i = 0; i < n; i++){cou[a[i] - min]++;}//排序int k = 0;for (int i = 0; i < range; i++){for (int j = 0; j < cou[i]; j++){a[k++] = i + min;}}
}

3.复杂度与稳定性分析

(1)时间复杂度

        对于计数排序,假设其跨度为m,它存在着三次遍历,前两次是对原数组的遍历(n),最后一次是对计数数组与其值的遍历(n+m)。因此其时间复杂度与数据规模n和数据跨度m都有关系,时间复杂度为O(n+m)

(2)空间复杂度

        计数排序使用了计数数组,计数数组的规模是根据待排序数组的跨度m而定的,所以其空间复杂度为O(m)

(3)稳定性

        计数排序是稳定的。

        对于计数排序而言,因为我们是遍历其原数组进行对计数数组的写入再输出,根据遍历访问的先后顺序我们是有办法控制其稳定的,如利用队列等控制同一个值的先入先出。指的一提的是稳定性的意义更多用于复杂对象,我们根据其某一个指标排序而维持此前的相对位置,所以如果需要稳定的计数排序,以我现在的水平来说,我会选择使用队列来存储每个计数背后的复杂对象来实现先进先出。

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

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

相关文章

开源软件的影响力

开源软件对现代信息技术产业产生了深远的影响。以下是开源软件的一些主要影响&#xff1a; 降低成本&#xff1a;开源软件允许个人和企业无需支付高额授权费即可获取高质量的软件&#xff0c;从而显著降低软件采购和使用的成本。1 提高效率&#xff1a;由于开源软件由全球开…

Spark 的Driver程序中定义的外部变量或连接为什么不能在各种算在中直接用,如果要要如何做?

在Driver程序中定义的外部变量或连接不能在算子中直接使用&#xff0c;因为它们不会被序列化并发送到各个Executor。如果需要在算子使用外部资源&#xff0c;应该在算子内部初始化这些资源。 例如&#xff0c;将RDD数据写入数据库可以这样实现&#xff1a; rdd.foreach(recor…

基于YOLOv8的船舶目标检测系统(Python源码+Pyqt6界面+数据集)

博主简介 AI小怪兽&#xff0c;YOLO骨灰级玩家&#xff0c;1&#xff09;YOLOv5、v7、v8优化创新&#xff0c;轻松涨点和模型轻量化&#xff1b;2&#xff09;目标检测、语义分割、OCR、分类等技术孵化&#xff0c;赋能智能制造&#xff0c;工业项目落地经验丰富&#xff1b; …

项目02《游戏-04-开发》Unity3D

基于 项目02《游戏-03-开发》Unity3D &#xff0c; 因前三集资源以及代码冗余问题&#xff0c;本次项目对前三集进行了重做&#xff0c;资源及代码如下&#xff0c; 首先导入场景及人物资源&#xff0c; 为人物添加动画控制器Animator组件&#xff0c; 创建动画控…

人工智能基础-matplotlib基础

绘制图形 import numpy as np x np.linspace(0, 10, 100) y np.sin(x) import matplotlib as mpl import matplotlib.pyplot as plt plt.plot(x, y) plt.show()绘制多条曲线 siny y.copy() cosy np.cos(x) plt.plot(x, siny) plt.plot(x, cosy) plt.show()设置线条颜色 …

Jasperreport 生成 PDF之省纸模式

省纸模式顾名思义就是节省纸张&#xff0c;使用 Jasper 去生成 PDF 的时候如果进行分组打印的时候&#xff0c;一页 A4 纸只会打印一组数据。这种情况下&#xff0c;如果每组数据特别少&#xff0c;只有几行&#xff0c;一页 A4 纸张根本用不了&#xff0c;就会另起一页继续打印…

【傻瓜式教程】docker运行facechain

首选&#xff0c;为了防止后期docker满&#xff0c;Docker容器 - 启动报错&#xff1a;No space left on device&#xff0c;更换一下docker存储位置 1、停止Docker服务 首先停止Docker守护进程&#xff0c;可以使用以下命令&#xff1a; sudo systemctl stop docker 备份现有…

旧衣物回收小程序开发,互联网模式下的营收有多大?

在当下快节奏的生活中&#xff0c;人们不仅生活水平在提高&#xff0c;消费水平也在逐渐提高&#xff0c;从而导致了闲置衣物的增加。为了减少浪费&#xff0c;旧衣服回收行业受到了大众的广泛关注&#xff0c;成为循环利用的一大方式。 当然&#xff0c;在当下网络时代&#…

时间复杂度为 O(n) 的排序算法

大家好&#xff0c;我是 方圆。本文介绍线性排序&#xff0c;即时间复杂度为 O(n) 的排序算法&#xff0c;包括桶排序&#xff0c;计数排序和基数排序&#xff0c;它们都不是基于比较的排序算法&#xff0c;大家重点关注一下这些算法的适用场景。 桶排序 桶排序是分治策略的一…

kingbase控制文件重建

背景&#xff1a; 测试版本&#xff1a;V008R006C005B0023 sys_control文件在数据目录的global下 若sys_control文件损坏或被删&#xff0c;会导致库无法启动 处理方式&#xff1a; 所在目录为数据目录 1、尝试dryrun touch global/sys_control sys_resetwal -l 00000001…

vue基本理解

1、js闭包&#xff0c;作用&#xff1f;&#xff1f; 闭包是指在一个函数内部&#xff0c;可以访问外部函数的变量&#xff0c;即使外部函数已经执行完毕。闭包的作用有&#xff1a; 保护变量&#xff1a;闭包可以保护函数内部的变量&#xff0c;使其不受外部环境的影响。实现…

100 个 NLP 面试问题

100 个 NLP 面试问题 一、 说明 对于技术磨练中&#xff0c;其中一项很酷的技能培训是提问。不知道答案并没有多大的错;错就错在不谷歌这些疑问。本篇就是在面试之前&#xff0c;您将此文档复制给自己&#xff0c;做一个系统的模拟实战。 二、经典NLP问题&#xff08;共8题&a…

代码随想录算法训练营第三十四天|62.不同路径 , 63. 不同路径 II

确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 62.不同路径 代码随想录 视频讲解&#xff1a;动态规划中如何初始化很重要&#xff01;| LeetCode&#xff1a;62.不同路径_哔哩哔哩_bilibili class Solut…

洪水攻击:理解与防御

一、引言 洪水攻击是一种常见的网络攻击手段&#xff0c;其特点是攻击流量巨大&#xff0c;远远超过目标系统或网络的正常处理能力。这种攻击方式会给目标系统带来巨大的压力&#xff0c;可能导致系统崩溃或网络瘫痪。本文将深入探讨洪水攻击的本质、常见类型以及防御策略。 …

gogs 搭建私人git服务器遇到的问题汇总

1、新建用户 运行 sudo adduser git 新建好 git 用户。 su git 以 git 用户登录 2、下载解压安装包 下载地址&#xff1a;From binary - Gogs 选择相对应的版本&#xff0c;下载并解压到/home/git文件下 3、运行安装 首先建立好数据库。在 Gogs 目录的 scripts/mysql.sql…

【ETOJ P1014】straax‘aks Array 题解(多重循环+暴力枚举+位运算)

题目描述 给定一个长度为 n n n 的数组 a a a 和一个整数 m m m&#xff0c;问数组中有多少个三元组 ( i , j , k ) (i,j,k) (i,j,k)&#xff0c;满足&#xff1a; i < j < k i < j < k i<j<k ( a i a j a k ) ( a i ⊕ a j ⊕ a k ) ≥ m (a_i a_j…

Jenkins任意文件读取漏洞(CVE-2024-23897)复现

Jenkins 有一个内置的命令行界面CLI&#xff0c;在处理 CLI 命令时Jenkins 使用args4j 库解析 Jenkins 控制器上的命令参数和选项。此命令解析器具有一个功能&#xff0c;可以将参数中后跟文件路径的字符替换为文件内容 ( expandAtFiles)。具有Overall/Read权限的攻击者可以读取…

mysql主流版本5.5/5.6/5.7/8.0重置修改密码方法

最近几天来回切换各个Mysql版本重置密码&#xff0c;记录一下各个版本重置密码的方法。 MySql 5.5 SET PASSWORD FOR usernamelocalhost PASSWORD(new_password);MySql5.6 SET PASSWORD FOR usernamelocalhost new_password;MySql5.7 ALTER USER usernamelocalhost IDENT…

PeakCAN连接到WSL2 Debian

操作步骤 按照以下步骤进行操作&#xff1a; 在Windows下安装PeakCAN驱动并安装&#xff0c;地址是https://www.peak-system.com/PCAN-USB.199.0.html?&L1 在Windows下安装usbipd&#xff0c;地址是https://github.com/dorssel/usbipd-win/releases&#xff0c;最新版是…

C#字符串匹配(模式搜索)BF(Brute Force)暴力算法

暴力算法概念 暴力算法&#xff08;Brute Force Algorithm&#xff09;是一种简单直接的解决问题的方法&#xff0c;它通过穷举所有可能的解决方案来寻找问题的解。暴力算法通常是基于穷举搜索的思想&#xff0c;遍历所有可能的情况&#xff0c;然后逐一检查每种情况是否满足问…