当前位置: 首页 > news >正文

C++数据结构X篇_19_排序基本概念及冒泡排序(重点是核心代码)

文章目录

  • 1. 排序基本概念
  • 2. 冒泡排序
    • 2.1 核心代码
    • 2.2 冒泡排序代码
    • 2.3 查看冒泡排序的时间消耗
    • 2.4 冒泡排序改进版减小时间消耗

1. 排序基本概念

现实生活中排序很重要,例如:淘宝按条件搜索的结果展示等。

  • 概念
    排序是计算机内经常进行的一种操作,其目的是将一组“无序”的数据元素调整为“有序”的数据元素。

  • 排序数学定义:
    假设含 n 个数据元素的序列为( R1, R2,… Rn) 其相应的关键字序列为( K1, K2,., Kn),这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系:Kp1≤Kp2≤…≤Kpn
    按此固有关系将上式记录序列重新排列为(Rp1,Rp2,…,Rpn)的操作称作排序

  • 排序的稳定性
    如果在序列中有两个数据元素r[i]和r[j],它们的关键字 k[i]==k[j],且在排序之前,对象 r[i]排在r[j]前面。如果在排序之后,对象 r[i]仍在r[j]前面,则称这个排序方法是稳定的,否则称这个排序方法是不稳定的。
    在这里插入图片描述

  • 多关键字排序
    排序时需要比较的关键字多余一个,排序结果首先按关键字 1 进行排序,当关键字1相同时按关键字 2 进行排序,当关键字 n-1 相同时按关键字n进行排序,对于多关键字排序,只需要在比较操作时同时考虑多个关键字即可 !

  • 排序中的关键操作

    • 比较:任意两个数据元素通过比较操作确定先后次序。
    • 交换:数据元素之间需要交换才能得到预期结果
  • 内排序和外排序

    • 内排序:在排序过程中,待排序的所有记录全部都放置在内存中,排序分为:内排和外排序。
    • 外排序:由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行。
  • 排序的审判

    • 时间性能:关键性能差异体现在比较和交换的数量
    • 辅助存储空间:为完成排序操作需要的额外的存储空间,必要时可以“空间换时间”
    • 算法的实现复杂性:过于复杂的排序法会影响代码的可读性和可维护性,也可能影响排序的性能
  • 总结

    • 排序是数据元素从无序到有序的过程
    • 排序具有稳定性,是选择排序算法的因素之一
    • 比较和交换是排序的基本操作
    • 多关键字排序与单关键字排序无本质区别
    • 排序的时间性能是区分排序算法好坏的主要因素

2. 冒泡排序

冒泡排序就是相邻两个元素进行交换,可以从上往下冒,也可以从下往上冒,下图为一个循环的冒泡。
在这里插入图片描述

2.1 核心代码

//冒泡排序
void bubble_sort(int arr[], int length)
{for (int i = 0; i < length - 1; i++){for (int j = 0; j < length - i - 1; j++){//此处为升序,降序的话arr[j] < arr[j + 1]if (arr[j] > arr[j + 1])  //升序{swap(&arr[j], &arr[j + 1]);}}}
}

2.2 冒泡排序代码

实现冒泡排序的代码如下

#include <iostream>
#include <time.h>
using namespace std;#define MAX 10void swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}//打印数组
void printArr(int arr[])
{for (int i = 0; i < 10; i++){cout << arr[i] << endl;}
}//冒泡排序
void bubble_sort(int arr[], int length)
{for (int i = 0; i < length - 1; i++){for (int j = 0; j < length - i - 1; j++){if (arr[j] > arr[j + 1])  //升序{swap(&arr[j], &arr[j + 1]);}}}printArr(arr);
}int main()
{int arr[MAX];//生成随机数srand((unsigned int)time(NULL));for (int i=0;i<MAX;i++){arr[i] = rand() % MAX;}bubble_sort(arr, MAX);system("pause");return 0;
}

2.3 查看冒泡排序的时间消耗

敲代码查看冒泡排序的时间消耗

#include <iostream>
#include <time.h>
#include <sys/timeb.h>using namespace std;#define MAX 10000//获取系统当前时间,ms为单位
long getSystemTime()
{struct timeb tb;ftime(&tb);return tb.time * 1000 + tb.millitm;
}void swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}//打印数组
void printArr(int arr[])
{for (int i = 0; i < 10; i++){cout << arr[i] << endl;}
}//冒泡排序
void bubble_sort(int arr[], int length)
{for (int i = 0; i < length - 1; i++){for (int j = 0; j < length - i - 1; j++){if (arr[j] > arr[j + 1])  //升序{swap(&arr[j], &arr[j + 1]);}}}//printArr(arr);
}int main()
{int arr[MAX];//生成随机数srand((unsigned int)time(NULL));for (int i=0;i<MAX;i++){arr[i] = rand() % MAX;}long tStart = getSystemTime();bubble_sort(arr, MAX);long tEnd = getSystemTime();cout << tEnd - tStart << endl;system("pause");return 0;
}

运行结果:3247ms
在这里插入图片描述

2.4 冒泡排序改进版减小时间消耗

下图中,当9排到第一个就已经是有序的了。之前的版本每一个都需要进行比较,我们可以判断其在有序的情况下就可以退出了,没有必要一直比较循环。这样就提高了冒泡排序的效率。
在这里插入图片描述
在核心代码中有一次循环并不执行swap(&arr[j], &arr[j + 1]);就代表已经有序了

int flag=0;//标识没有排序好
//冒泡排序
void bubble_sort(int arr[], int length)
{for (int i = 0; i < length - 1 && flag==0; i++){for (int j = 0; j < length - i - 1; j++){flag = 1;//认为已经排序好//此处为升序,降序的话arr[j] < arr[j + 1]if (arr[j] > arr[j + 1])  //升序{flag=0;swap(&arr[j], &arr[j + 1]);}}}
}

整体代码为:

#include <iostream>
#include <time.h>
#include <sys/timeb.h>using namespace std;#define MAX 10000//获取系统当前时间,ms为单位
long getSystemTime()
{struct timeb tb;ftime(&tb);return tb.time * 1000 + tb.millitm;
}void swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}//打印数组
void printArr(int arr[])
{for (int i = 0; i < 10; i++){cout << arr[i] << endl;}
}int flag = 0;//标识没有排序好
//冒泡排序
void bubble_sort(int arr[], int length)
{for (int i = 0; i < length - 1 && flag == 0; i++){for (int j = 0; j < length - i - 1; j++){flag = 1;//认为已经排序好//此处为升序,降序的话arr[j] < arr[j + 1]if (arr[j] > arr[j + 1])  //升序{flag = 0;swap(&arr[j], &arr[j + 1]);}}}
}int main()
{int arr[MAX];//生成随机数srand((unsigned int)time(NULL));for (int i=0;i<MAX;i++){arr[i] = rand() % MAX;}long tStart = getSystemTime();bubble_sort(arr, MAX);long tEnd = getSystemTime();cout << tEnd - tStart << endl;system("pause");return 0;
}

运行结果:1800ms,耗时变为原先的一半
在这里插入图片描述

  1. 排序基本概念,冒泡排序,冒泡排序改进版
  2. 参考博文:常见的几种排序(C++

相关文章:

C++数据结构X篇_19_排序基本概念及冒泡排序(重点是核心代码)

文章目录 1. 排序基本概念2. 冒泡排序2.1 核心代码2.2 冒泡排序代码2.3 查看冒泡排序的时间消耗2.4 冒泡排序改进版减小时间消耗 1. 排序基本概念 现实生活中排序很重要&#xff0c;例如:淘宝按条件搜索的结果展示等。 概念 排序是计算机内经常进行的一种操作&#xff0c;其目…...

LeetCode LCR 179. 查找总价格为目标值的两个商品

和为 s 的两个数字 题目链接 LCR 179. 查找总价格为目标值的两个商品 购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况&#xff0c;返回任一结果即可。 示例 1&#xff1a; 输入&#xff1a;price [3, 9, 12, …...

上架用的SDK三方应用隐私

SDK名称&#xff1a;华为推送 使用目的&#xff1a;用于向华为手机用户推送消息 使用场景&#xff1a;用户账号相关促销活动、消息提醒更新时 信息收集类型&#xff1a;设备相关信息&#xff08;Android_ID&#xff09;使用的敏感权限&#xff1a;不涉及 使用的敏感权限&am…...

从REST到GraphQL:升级你的Apollo体验

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

Jupyter使用技巧-环境篇

不同于其他IDE&#xff0c;有时会出现找不到文件路径&#xff0c;通常是因为当前工作目录&#xff08;working directory&#xff09;不同所导致的。Jupyter Notebook 会在启动时选择一个初始的工作目录&#xff0c;而这个目录可能与你运行 .py 文件时所在的目录不同。 import…...

软件项目管理【UML-组件图】

目录 一、组件图概念 二、组件图包含的元素 1.组件&#xff08;Component&#xff09;->构件 2.接口&#xff08;Interface&#xff09; 3.外部接口——端口 4.连接器&#xff08;Connector&#xff09;——连接件 4.关系 5.组件图表示方法 三、例子 一、组件图概念…...

npm版本错误——npm ERR! code ERESOLVE 解决方法

起因 项目中echart版本过低&#xff0c;导致某些图表不能正确显示&#xff0c;所以大手一挥&#xff0c;将echart版本从4升级到了5&#xff0c; 再去运行项目的时候 就发现项目报错了 npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! …...

基于卷积神经网络的乳腺癌分类 深度学习 医学图像 计算机竞赛

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…...

模式识别——高斯分类器

模式识别——高斯分类器 需知定义特殊情况&#xff08;方差一致&#xff09;Sigmoid 需知 所有问题定义在分类问题下&#xff0c;基于贝叶斯决策 定义 条件概率为多元高斯分布&#xff0c;此时观测为向量 X X 1 , X 2 , . . . , X n X{X_1,X_2,...,X_n} XX1​,X2​,...,Xn​…...

LeetCode 15. 三数之和

三数之和 题目链接 15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 **注意&#xff1a;**答案…...

React-native-camera 在小米手机上拍照查看闪退

场景&#xff1a;为实现可拍照和录像的相机用react-native-camera这个库手写一个相机&#xff0c;发现了拍出来的图片在小米10上查看闪退 根据手机后台捕获的错误信息是什么玩意太大了&#xff08;之前还以为是图片显示组件的问题&#xff09; 改进&#xff1a;相机吊起的时候…...

nodejs+vue大学生社团管理系统

通过软件的需求分析已经获得了系统的基本功能需求&#xff0c;根据需求&#xff0c;将大学生社团管理系统平台功能模块主要分为管理员模块。管理员添加社团成员管理、社团信息管理&#xff0c;社长管理、用户注册管理等操作。 目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1…...

异步编程详解(.NET)

在之前写的一篇关于async和await的前世今生的文章之后&#xff0c;大家似乎在async和await提高网站处理能力方面还有一些疑问&#xff0c;很多网站本身也做了不少的尝试。今天我们再来回答一下这个问题&#xff0c;同时我会做一个async和await在WinForm中的尝试&#xff0c;并且…...

excel怎么固定前几行前几列不滚动?

在Excel中&#xff0c;如果你想固定前几行或前几列不滚动&#xff0c;可以通过以下几种方法来实现。详细的介绍如下&#xff1a; **固定前几行不滚动&#xff1a;** 1. 选择需要固定的行数。例如&#xff0c;如果你想要固定前3行&#xff0c;应该选中第4行的单元格。 2. 在E…...

elasticsearch完整学习

文章目录 elasticsearch一、概念二、ELK集群部署三、图形化界面 elasticsearch 一、概念 1、ELKStack简介&#xff08;都是java架构&#xff0c;需要jdk底层&#xff09; 什么是ELK&#xff1f;通俗来讲&#xff0c;ELK是由Elasticsearch、Logstash、Kibana 三个开源软件组成的…...

vscode Coder Runner 运行C++

1. 设置Code Runner 2. 防止输入读不到&#xff0c;把在终端运行勾上。 3. 设置minw/bin的环境变量 安装mingw教程&#xff1a;https://blog.csdn.net/fancy_male/article/details/133992000 4. 见图...

牛客网刷题-(2)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…...

FreeRTOS基础(如何学好FreeRTOS?)

目录 基础知识 进阶内容 后期“摆烂” 基础知识 实时操作系统 (RTOS)&#xff1a;FreeRTOS是一个实时操作系统&#xff0c;它提供了任务管理、调度和同步等功能&#xff0c;在嵌入式系统中有效地管理多个任务。 任务&#xff08;Task&#xff09;&#xff1a;任务是在RTOS…...

读书笔记:Effective C++ 2.0 版,条款43(多继承)、条款44(概念明确)、条款45-50(杂项)

条款43: 明智地使用多继承 并没有禁止&#xff0c;从概念上讲&#xff0c;多继承可能更符合真实世界。 条款44: 说你想说的&#xff1b;理解你所说的 概念明确 条款45: 弄清C在幕后为你所写、所调用的函数 隐性成本&#xff0c;看下编译后的c、asm源码。 条款46: 宁可编译和…...

最新Jn建站系统2.0 已集成各类源码 【附视频安装教程】

附视频安装教程|已集成各类源码 目前已集成的网站&#xff1a; 1.发卡网(最新) 2.代刷网(无需授权) 3. 博客网(自带模板) 4.易支付(稳定版) 5.个人导航网(简洁) 6.代理查询网 7.留言网 8.匿名网 9.表白墙(最新) 10.抽奖网 11.源码站 12.z-blog博客程序 13.织梦CM…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...