c++排序算法(快速排序、冒泡排序、选择排序)

2023-11-11

1——快速排序,这里的容器是全局的,不全局的话,可以在参数那里加个数组的参数传进来。

从大到小:

//从大到小排序
void ResManage::quickSortLastUpdateTime(const int iLeftIndex, const int iRightIndex)
{
    int iTempElement = m_qlTempRes.value(iLeftIndex).iLastUpdateTime; //暂存基准数
    int iTempLeftIndex = iLeftIndex;//最左位置
    int iTempRightIndex = iRightIndex;//最右位置

    if(iLeftIndex > iRightIndex) //递归结束条件
    {
        return;
    }

    while (iTempLeftIndex != iTempRightIndex) //当iTempLeft和iTempRight不重合时
    {
        while(m_qlTempRes.value(iTempRightIndex).iLastUpdateTime <= iTempElement
              && iTempLeftIndex < iTempRightIndex)//从右往左寻找大于基准数的值
        {
            iTempRightIndex--;
        }
        while(m_qlTempRes.value(iTempLeftIndex).iLastUpdateTime >= iTempElement
              && iTempLeftIndex < iTempRightIndex)//从左往右寻找小于基准数的值
        {
            iTempLeftIndex++;
        }      
        if(iTempLeftIndex < iTempRightIndex)
        {
            //找到了且i<j则交换数值
            m_qlTempRes.swap(iTempLeftIndex,iTempRightIndex);
        }
    }
    //将基准数和iTempLeftIndex、iTempRightIndex的相遇数值进行交换
    if(iLeftIndex != iTempLeftIndex)
    {
        m_qlTempRes.swap(iLeftIndex,iTempLeftIndex);
    }
    //应用递归对此时基准数的左边进行快速排序
    quickSortLastUpdateTime(iLeftIndex,iTempLeftIndex-1);
    //应用递归对此时基准数的右边进行快速排序
    quickSortLastUpdateTime(iTempLeftIndex+1,iRightIndex);
}

原理:从序列的两端开始
(1)首先将最左边的数值作为基准数,应用2个变量iTempLeftIndex和iTempRightIndex

分别指向序列左端和右端;
(2)首先从iTempLeftIndex左往右寻找一个小于基准数的数,iTempRightIndex从右往左寻找一个大于2的数;

如果是从小到大的排序,就从左边往右找大于基数的数,从右边往左找小于基数的数。为什么这样,大家换个角度想想我们最后是要交换iTempLeftIndex、iTempRightIndex的值就可以想通了。
(3)找到了之后进行第一次交换,继续搜索;
(5)当iTempLeftIndex和iTempRightIndex都到了同一个位置后,表明第一轮交换结束,将基准数和iTempLeftIndex上的值进行交换,此时以iTempLeftIndex位置为分界线,左边的值都是大于iTempLeftIndex位置上的值,右边的值都是小于iTempLeftIndex上的值。

(6)最后调用递归分别处理左边序列和右边序列即可。

2——冒泡排序:从小打大

算法的思想:其实就是把每个值都和数组里面的值进行一遍比较(相邻位置)。

比如第一次循环:第一个值依次和后面值进行比较,比较完之后,最后一个位置的值一定是最大的。

第二次循环:第一个值依次和后面n-1个值进行比较,同理,比较完换值之后,倒数第二个位置的值是第二大的。

依次这样即可。

void bubbleSort(int a[], int n)
{
    for(int i =0 ; i< n-1; ++i)
    {
        for(int j = 0; j < n-i-1; ++j)
        {
            if(a[j] > a[j+1])//从大到小的话,这里换成小于就可以了
            {
                int tmp = a[j] ; //交换
                a[j] = a[j+1] ;
                a[j+1] = tmp;
            }
        }
    }
}

3——选择排序

void selestSort(int a[],int n)
{
    int iMinIdex=0;//假设这个位置上的值就是最小的
    int temp;
    for(int i=0;i<n;i++)
    {
        iMinIdex = i;
        for(int j=i+1;j<n;j++)
        {
            if(a[j] < a[iMinIdex])
            {
                iMinIdex = j;
            }
        }
        temp = a[iMinIdex];
        a[iMinIdex] = a[i];
        a[i] = temp;
    }
}

思想:分成两列,未排序和已排序,第一次选出最小或最大的值放在排序的一边,下次在未排序的队列中找出最小或最大的值放入已排序的一边,如此循环即可。

4——插入排序的思想:

从第一个元素开始,该元素可以认为已经被排序

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

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

重复步骤,直到找到已排序的元素小于或者等于新元素的位置

将新元素插入到该位置后

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++排序算法(快速排序、冒泡排序、选择排序) 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • Hyper Terminal 配置体验分享

    Hyper Terminal 简介 Hyper is an Electron based terminal Built on HTML CSS JS Fully extensible 以上内容来自Hyper Terminal官网对该终端的介
  • 基于卷积神经网络-门控循环单元(CNN-GRU)多输入多输出预测,CNN-GRU回归预测。

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 导入数据 res xlsread 数据 xlsx 数据分析 num size 0 8 训练集占数据集比例 ou
  • vue解决弹出图片显示在弹框下方

    弹出的图片显示在弹框下面怎么办 问题来源 问题分析 解决方法 问题来源 在写前端vue项目时 在用到ele的 el image 这个组件时 有时会出现图片显示在弹框即dialog下面 后面发现是因为el image组件 默认的z index
  • 【ffmpeg基础】ffmpeg的下载安装

    一 ffmpeg的下载 1 ffmpeg github下载路径 https github com FFmpeg FFmpeg git 在ffmpeg的github上可以下载任意版本的源码 比如最新的matser上的源码 以及各个分支上 如f
  • unity 屏幕虚拟键盘

    工作上碰到许多程序需要用到键盘输入功能 调用的电脑自带键盘使用也不方便 自己写的一个键盘工具 功能 键盘大小写状态监测 设置了输入法提示词位置的定位 定位根据屏幕分辨率设置 故编辑器模式下位置有偏移 可自行调整 工具连接 https dow
  • rocketMq消息队列原生api使用以及rocketMq整合springboot

    rocketMq消息队列 文章目录 rocketMq消息队列 一 RocketMQ原生API使用 1 测试环境搭建 2 RocketMQ的编程模型 3 RocketMQ的消息样例 3 1 基本样例 3 2 顺序消息 3 3 广播消息 3 4
  • Friend-Graph HDU - 6152 签到题 暴力遍历

    Friend Graph HDU 6152 题意 给你n个人 告诉你他们之间的关系 如果有三个以上的人互相不认识或者互相认识 就认为这个团队是 Bad Team 反之输出 Great Team 我的想法就是暴力搜索 用一个二维数组保存每个人
  • 利用硬件实现矩阵乘法加速

    对于绝大多数程序员来说 优化程序往往是在算法方面 但了解一定的计算机硬件知识后 可以隐式地优化程序 下面以矩阵乘法为例 探讨计算机硬件在程序优化中的作用 原理 学过计算机组成原理的都知道 CPU访问内存的速度比CPU计算速度慢得多 为了解决
  • WKWebView设置请求头HTTPHeaderField

    WKWebView HTTPHeaderField WKWebView的请求头添加字段 系统的NSMutableHTTPURLRequest类提供了获取HTTP请求的请求头 HTTPHeader 和设置 添加HTTP请求的请求头的API p
  • 龙书D3D11章节习题答案(第四章)

    以下答案仅供参考 有错欢迎留言 Chapter 4 Direct3D Initialzation 1 Modify the previous exercise solution by disabling the ALT ENTER func
  • DVWA XSS总结

    笔者对该靶场所需的相关知识进行了总结 拓展 供大家学习参考 XSS 漏洞学习 DVWA XSS Reflected low 未进行过滤 构造payload medium 过滤规则 把 lt script gt 用str replace 函数
  • Java类加载

    1 JAVA类装载器在装载类的时候是按需加载的 只有当一个类要使用 使用new 关键字来实例化一个类 的时候 类加载器才会加载这 个类并初始化 类Main java 代码 publicclass Main publicstaticvoid
  • STM32—CAN通信

    文章目录 一 CAN通信简介 1 1 CAN简介 1 2 CAN协议特点 1 3 CAN通信的帧类型 1 4 数据帧结构 1 5 CAN的位时序 1 6 CAN的仲裁功能 二 STM32F1的CAN 2 1 bxCAN简介 2 2 bxCA
  • 8-js高级-6(promise)

    一 Promise 的理解和使用 1 Promise 是什么 理解 抽象表达 Promise 是一门新的技术 ES6 规范 Promise 是 JS 中进行异步编程的新解决方案 备注 旧方案是单纯使用回调函数 具体表达 从语法上来说 Pro
  • c语言练习题56:变种水仙花

    变种水仙花 描述 变种水仙花数 Lily Number 把任意的数字 从中间拆分成两个数字 比如1461 可以拆分成 1和461 14和61 146和1 如果所有拆分后的乘积之和等于自身 则是一个Lily Number 例如 655 6 5
  • Echarts柱状图的点击事件

    最近在做一些图表统计的功能 用到了百度的开源图表软件Echatrs 不得不提的是 不但上手简单而且扩展功能也是十分强大 在使用的过程中也遇到了不少问题 可能由于有关Echatrs的资料并不是很齐全 所以查找资料的过程也是相当曲折的 所以还是
  • 硬盘错误计数 计算机内存不足,硬盘问题!Ultra DMA CRC错误计数 电脑死机

    最近电脑经常出现卡机状态 此状态出现前先是硬盘嗡嗡响 就像汽车油门一样 一加一松 但声音不是很大 然后硬盘紧接着还有嘎吱的响声 这样重复几次 出现这种声音的时候 电脑出现死机状态 但停上几分钟后 一切恢复正常 有时候也会卡到电脑自动重新启动
  • linux下sqlite3的使用实例(c语言)

    文章目录 1 安装数据库 2 相关函数 3 代码实例 3 1创建一个数据库 3 2插入数据 3 3查看表的内容 3 4删除数据 1 安装数据库 Linux 下安装sqlite3 需要两个个命令 即可 1 sudo apt get insta
  • Bootstrap Table行内添加/行内编辑案例

    项目场景 JQuery版本为 3 6 0 Bootstrap版本为 3 4 1 Bootstrap Table版本为 1 8 1 Bootstrap Table Edit版本为 1 0 Bootstrap Select版本为 1 0 Boo
  • c++排序算法(快速排序、冒泡排序、选择排序)

    1 快速排序 这里的容器是全局的 不全局的话 可以在参数那里加个数组的参数传进来 从大到小 从大到小排序 void ResManage quickSortLastUpdateTime const int iLeftIndex const i