排序算法c++实现

C++ 实现冒泡排序法 因为内层循环每完成一次,最大那个值(或最小那个值),就已经交换到了最后的位置,所以下次交换的时候我们就要减少一次交换已经排序好的元素,依次类推,所以就有。但上面主函数的 buf1 数组中,只有 5 是需要排序的,其他的都不用排序,好像就是直接把 5 放在最后面即可完成排序了,也就是进行排序 1 次就行了,现在在小优化一下。,原因是在 if 那里退出了,cnt 少加了 1 次,不过这个影响不大。结果说明,某种的优化只能说针对某一个方面,最后还是得见招拆招。当然,这不是万能的哈,比如这样,它就不适用了。 阅读详情

一、冒泡排序

// 冒泡排序
void BubbleSort(vector<int> v) {
    int n = v.size();
    // i代表第几轮,总共有n-1轮排序
    // j是索引,用来对数组v进行操作
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < n - i; j++) {
            if (v[j] > v[j + 1]) {
                swap(v[j], v[j + 1]);
            }
        }
    }
}

二、插入排序

数组分为两部分,有序和无序
将无序数组的元素插入有序数组 [参考1]
// 插入排序
void InsertSort(vector<int> v) {
    int n = v.size();
    //i是无序数组头部,j是遍历整个有序数组的下标
    for (int i = 1; i < n; i++) {
        for (int j = i - 1; j >= 0 && v[j] > v[j+1]; j--) {
            swap(v[j], v[j + 1]);
        }
    }
}

三、选择排序

每次选择 最小的数放在数组首部,有n个数则选择n次 [参考1]
// 选择排序
void SelectSort(vector<int> v) {
    int n = v.size();
    for (int i = 0; i < n; i++) {
        int min_ = i;
        for (int j = i + 1; j < n; j++) {
            min_ = v[min_] >= v[j] ? j : min_;
        }
        if(i != min_)
            swap(v[i], v[min_]);
    }
}

四、快排

pivot是分界点
在pivot以前的数都比v[pivot]小,在pivot以后的数都比v[pivot]大 [参考2] [参考3]
//快排
void QuickSort(vector<int>& v, int start, int end) {
    if (start >= end) return;
    int pivot = start;
    int i = start;
    int j = end;
    while (i < j) {
        //j向左移,找到第一个比基准v[pivot]小的
        while (v[j] >= v[pivot] && i < j) j--;
        //i向右移,找到第一个比基准值v[pivot]大的
        while (v[i] <= v[pivot] && i < j) i++;
        //左右指针相遇前交换
        if(i < j)
            swap(v[i], v[j]);
    }
    swap(v[pivot], v[i]);
    QuickSort(v, start, i - 1);
    QuickSort(v, i + 1, end);
}

五、完整代码

#include<iostream>
#include<vector>

using namespace std;
void Print(vector<int> v) {
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
    cout << endl;
}
// 冒泡排序
void BubbleSort(vector<int> v) {
    int n = v.size();
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < n - i; j++) {
            if (v[j] > v[j + 1]) {
                swap(v[j], v[j + 1]);
            }
        }
    }
    Print(v);
}

// 插入排序
void InsertSort(vector<int> v) {
    int n = v.size();
    for (int i = 1; i < n; i++) {
        for (int j = i - 1; j >= 0 && v[j] > v[j + 1]; j--) {
            swap(v[j], v[j + 1]);
        }
    }
    Print(v);
}

// 选择排序
void SelectSort(vector<int> v) {
    int n = v.size();
    for (int i = 0; i < n; i++) {
        int min_ = i;
        for (int j = i + 1; j < n; j++) {
            min_ = v[min_] >= v[j] ? j : min_;
        }
        if (i != min_)
            swap(v[i], v[min_]);
    }
    Print(v);
}

//快排
void QuickSort(vector<int>& v, int start, int end) {
    if (start >= end) return;
    int pivot = start;
    int i = start;
    int j = end;
    while (i < j) {
        while (v[j] >= v[pivot] && i < j) j--;
        while (v[i] <= v[pivot] && i < j) i++;
        if(i < j)
            swap(v[i], v[j]);
    }
    swap(v[pivot], v[i]);
    QuickSort(v, start, i - 1);
    QuickSort(v, i + 1, end);
}

int main() {
    vector<int> v = { 2,9,-9,7,-6,8,0 };
    BubbleSort(v);
    InsertSort(v);
    SelectSort(v);
    QuickSort(v, 0, v.size()-1);
    Print(v);
    return 0;
};

参考:

1、https://mp.weixin.qq.com/s/YQN-DE5aVRO1m1PDXlVAPg

2、https://mp.weixin.qq.com/s/oty0EH_k6iuU-SZYPRWGSg

3、(221条消息) c++之七种经典排序算法-C++文档类资源-优快云文库

C++实现排序算法 一、冒泡排序 上浮法 :从数组末尾开始,连续比较相邻两个元素,使其符合排序。比较一个循环后,处于数组前排的元素最先符合(最大 or 最小),不再参与下一个循环的比较。 下沉法:从数组开头开始,连续比较相邻两个元素,使其符合排序。比较一个循环后,处于数组后排的元素最先符合(最大 or 最小),不再参与下一个循环的比较。 冒泡法最优时间复杂度可以达到O(n),最差可以达到O(n^2) 【注】如果上一次循环已经符合排序,即没有交换过一次,则已经排序完成,得到结果,不需要再进行下一次循环 参考代码 C+. 阅读详情

相关推荐

排序算法总结及C++实现

文章目录1 引入 认识时间复杂度2 补充 对数器3 排序算法分析3.1 基于比较的排序3.1.1 冒泡排序3.1.2 选择排序3.1.3 插入排序3.1.4 归并排序补充题目 小和问题补充题目 逆序数3.1.5 快速排序3.1.6 堆排序3.2 非基于比较的排序3.2.1 计数排序3.2.2 桶排序3.2.3 基数排序4 排序总结4.1 稳定性4.2 工程中的综合排序算法4.3 有关排序...

李滚滚的博客 2223

冒泡排序实现(c++)

算法之耻——冒泡排序

m0_73125687的博客 9699

c++模板类实现各种排序算法

头文件: //Sorting.h #ifndef DATALIST_H #define DATALIST_H #include&amp;amp;lt;iostream&amp;amp;gt; using namespace std; const int DefaultSize = 100; template&amp;amp;lt;typename T&amp;amp;gt; class Element { public: T key; //排序码 ...

NockinOnHeavensDoor的博客 1798

冒泡排序法(C++实现)

1、冒泡排序法 概念:略... 小提示:假设从小排到大的方式,一轮比较下来最大的值就会跑到末尾位置,再次进行二轮比较后最大值排在末尾倒数第二位,依次类推... 所以就得出 for 的判定条件是 j < cnt - 1 - i; // 冒泡排序 for (int i = 0; i < cnt; ++i) { for (int j = 0; j < cnt - 1 - i; ++j) { if (arr[j] > arr[j + 1]) // 从小排到

李戎戎的博客 2万+

各种排序算法及其C++代码实现

概念一:排序算法是否是稳定的 给定序列{3,15,8,8,6,9} 若排序后得到{3,6,8,8,9,15}, 则该排序算法是不稳定的,原本后面的8(加粗)现在位于前面了。 概念二: 内部排序、外部排序 内部排序是指将待排序的数据存放在内存中进行排序的过程。 外部排序是指待排序的数据很多,以致内存一次不能容纳所有数据,在排序过程中需要对外存进行访问的排序过程。 概念三:评价标准 排序过程中最基本的...

YQMind的博客 3061

经典排序算法C++实现(10种)

C++实现经典排序算法插入排序希尔排序(缩小增量排序)选择排序堆排序冒泡排序冒泡排序的原理:快速排序合并排序折中排序新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章U...

weixin_42023936的博客 3233

冒泡排序(C++)完整代码

算法学习 本人机械科研dog一枚,对算法感兴趣。这是我自学算法的记录。 第一天:冒泡排序 文章目录算法学习一、冒泡排序原理?二、核心代码三、算法复杂度分析 一、冒泡排序原理? 1、从后往前依次比较相邻的元素。若是要按照升序排序,则后面的元素比前面的小,就交换这2个元素;降序则相反。 2、对每一对相邻元素作同样的工作,从第一对到最后一对。进行一轮比较交换下来,最后的元素就会是最小(或最大)的数了,这个数就不用参与后面的比较操作了。 3、针对所有的元素重复以上的步骤。 4、持续每次对越来越少的元素重复上面的步骤

bookshu6的博客 1万+

C++实现冒泡排序算法(含源码)

冒泡排序是一种简单的排序算法,它通过不断交换相邻的元素,将较大的元素逐步"浮"到待排序列的尾部,从而实现排序。该函数接受一个整型数组和数组长度作为参数,在每次遍历中,它比较相邻的两个元素,将较大的元素向后交换。最终,得到一个有序的数组。以上是C++实现冒泡排序算法的例子。在实际开发中,我们可以通过调用这个函数来实现对数组的排序,从而提高程序的效率和准确性。C++实现冒泡排序算法(含源码)

. 5961

十大排序算法 (C++实现)

是时候梳理一下传说中的十大排序算法了。

2302_79769914的博客 1652

C++实现八大经典排序算法

希尔排序(Shell Sort)是一种基于插入排序的算法,通过将原始数据分成若干个子序列进行局部插入排序来达到整个序列的排序效果。这种排序方法由D.L.Shell于1959年提出,最初被称为“缩小增量排序”,后来人们将其命名为希尔排序。希尔排序的基本思想是将待排序数组分割成若干子序列,每个子序列由相同间隔的元素组成,然后对每个子序列进行插入排序。随着排序过程的不断深入,间隔逐渐减小,最终间隔减至1,整个数组变成一个序列进行普通插入排序。

weixin_34064233的博客 815

用C++实现交换排序算法

在计算机科学中,排序算法是被广泛研究的一类算法,它们用于将一系列元素按照特定的顺序(通常是数字或字母顺序)进行排列。排序算法的效率直接影响到程序运行的性能,特别是在处理大量数据时。不同的排序算法有着不同的性能特点,包括时间复杂度和空间复杂度,它们的选择依赖于具体的使用场景和数据规模。排序算法不仅在理论学习中占有重要地位,也是软件开发人员必须掌握的基础技能之一。掌握排序算法能帮助开发人员优化代码,提高软件的性能和可靠性。

weixin_35886636的博客 688

用C++实现各种排序算法

【代码】用C++实现各种排序算法。

weixin_53837303的博客 801

Zotero内存占用与存储优化:从根源解决卡顿与空间不足

文献管理软件在学术工作中扮演着重要角色,其核心原理是通过数据库管理元数据与附件文件,实现文献的快速检索与组织。然而,随着文献库规模增长,软件的资源管理机制可能面临挑战,尤其是内存占用与存储空间优化问题。从技术价值看,高效的附件管理策略不仅能提升软件响应速度,还能确保数据安全与可移植性。在实际应用场景中,研究者常遇到软件卡顿、存储目录膨胀等痛点,这通常与附件存储模式、缓存机制及数据库维护有关。本文聚焦于Zotero这一主流工具,针对其内存占用高、文件无法删除等常见问题,提供了外置存储、链接附件、数据库维护等系

weixin_34209060的博客 467

十大排序算法及其 C++ 实现

不同的排序算法适用于不同的场景,我们需要根据数据的特点和实际需求来选择合适的排序算法。例如,对于小规模数据,简单的排序算法如冒泡排序、选择排序和插入排序可能就足够了;而对于大规模数据,高效的排序算法如归并排序、快速排序和堆排序则更为合适。计数排序、桶排序和基数排序适用于特定类型的数据,如整数且数据范围较小的情况。数据特征对算法选择的影响元素重复性:如果数据中可能包含大量重复元素,三路快排是较好的选择。

m0_58220089的博客 1747

Java网页访问报错?手把手教你解决JRE插件缺失和浏览器拦截问题(附详细截图)

本文针对Java网页访问时常见的JRE插件缺失和浏览器拦截问题,提供了详细的诊断与解决方案。文章首先解释了问题根源在于现代浏览器出于安全考虑停止了对Java插件的支持,然后手把手指导用户确认Java安装、在控制面板配置安全站点列表,并针对Chrome、Edge、Firefox等主流浏览器的不同拦截机制给出了具体的应对策略,最后提供了系统性的故障排查清单,帮助用户彻底解决访问障碍。

weixin_29233857的博客 223

手把手教你用UC3844设计多路输出反激电源(附PCB布局避坑指南)

本文详细介绍了使用UC3844设计多路输出反激电源的实战技巧,包括核心电路设计、变压器参数计算、PCB布局优化及EMI抑制方法。通过实验室实测数据和项目经验,帮助工程师避开常见设计陷阱,提升电源性能和可靠性。特别附赠PCB布局避坑指南,助力高效完成开关电源设计。

weixin_30300225的博客 569

C++实现——排序算法总结

/* 常见的排序算法有:直接插入 希尔 冒泡 快速 选择 堆排序 归并 基数 *///下面一一分析,并实现: /* 1.冒泡排序 冒泡排序是最简单的排序算法,冒泡排序的基本思想是从后往前(或从前往后)两两比较相邻元素的值,若为逆序,则交换它们,直到序列比较完毕。我 们称它为一趟冒泡。每一趟冒泡都会将一个元素放置到最终的位置上。 */ //从前往后遍历,保证排好序的放到右侧 void Bub

硅谷 5020

避开地图定位偏差!手把手教你用Python实现火星坐标与WGS84精准转换

本文深入解析了国内地图服务中火星坐标(GCJ-02)与国际标准WGS84坐标系之间的偏差问题,并提供了基于Python的精准转换解决方案。文章详细阐述了坐标转换的核心原理,手把手教你构建可复用的转换工具包,并演示如何将其集成到实际应用(如Flask API)中,帮助开发者和数据分析师有效解决地图定位不准、多源数据无法对齐的痛点,提升地理信息处理能力。

weixin_29250403的博客 125

C++实现十大排序算法

今天我们来用C++实现一下经典的十大排序算法 具体代码与文件可访问我的GitHub地址获取 https://github.com/liuzuoping/Algorithms PS:欢迎star 1 冒泡排序 冒泡排序无疑是最为出名的排序算法之一,从序列的一端开始往另一端冒泡(你可以从左往右冒泡,也可以从右往左冒泡,看心情),依次比较相邻的两个数的大小(到底是比大还是比小也看你心情)。 (无序区...

liuzuoping的博客 1万+

ESP8266开发之旅 基础篇① 走进ESP8266的世界

    欢迎大家来到ESP8266的世界,从现在开始,笔者将带领大家慢慢揭开ESP8266神秘的面纱。 1. 简介     从笔者的角度来说,ESP8266这个词可以理解为ESP8266EX芯片(当然,后面也有可能出现了其他芯片,这里首推ESP8266EX)以及依赖ESP8266EX芯片开发的系列模组的简称。     ESP8266EX是由乐鑫信息科技公司(Espressif)出品的一款应用于物联...

单片机菜鸟哥的博客 15万+

功能安全实战系列09-英飞凌TC3xx LBIST开发详解

英飞凌Tricore/LBIST开发详解

initiallizer的博客 1108

C++ 实现选择排序算法

C++ 实现选择排序算法 思路 选择排序 选择排序(升序) 就是 从一组数字 选出 一个最小的元素 放在 第一个位置 之后在 剩下 的 元素中, 在选择一个 最小 的 位置 放入 第二位置 最后只剩下 一个元素, 整个排序过程完成. #include <iostream> using namespace std; void selectSort(int *arr, i...

阿常呓语的专栏 680

SIMULINK开发项目实例 1000 例专栏之第847例--基于飞行控制与稳定性的场景实例:多旋翼无人机在风扰动下的稳定性分析

本文介绍了使用Simulink进行多旋翼无人机风扰动稳定性分析的完整流程。首先建立包含动力学模型、控制系统和环境模拟三大模块的仿真系统,其中动力学模型基于牛顿-欧拉方程,控制系统采用PID调节器。重点展示了MATLAB函数实现的风扰动模型和姿态控制算法,通过设置输入信号和输出显示模块完成闭环仿真。最后通过多次风速条件下的仿真测试评估控制系统的抗干扰能力和稳定性表现,为无人机控制系统设计提供了有效的仿真验证方法。

xiaoheshang_123的博客 322

常见15种排序算法总结及C++代码实现

花了将近一个月时间,学习并整理了常见15种排序算法,并亲自用C++代码实现了一遍。 通过这次学习,我对于每种算法的具体细节、适用场景、复杂度分析,有了更深的理解,代码能力也有不少提高。 建议大家有时间的话,都能亲自手写一遍每种排序的代码,收获真的要比只理解概念大很多。

qq_27673853的博客 827

手把手教你学AI GPU的UMD驱动软件开发专栏简介

通过本专栏的学习,您将掌握UMD的核心概念、开发环境搭建、API实现、内存管理和同步技术,以及在实际AI场景中的应用。通过本专栏的学习,您将不仅掌握UMD驱动开发的核心技术,还将能够将这些技术应用到实际的AI应用场景中,为您的AI应用提供更高效的硬件加速支持。无论您是想开发自己的AI加速框架,还是希望深入理解现有AI加速库的工作原理,本专栏都将为您提供宝贵的知识和实践经验。:本专栏不仅讲解UMD驱动的核心概念,还通过精心设计的实战案例,引导您从零开始构建UMD驱动,真正掌握AI GPU驱动开发的技能。

MHD0815的博客 115

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

选择排序算法之C++实现

选择排序算法, 和上篇讲的冒泡算法很类似.很容易混淆理解.所以这篇紧接着就讲选择排序算法.上篇讲过, 之所以叫冒泡排序, 是因为从第一个数开始和自己相邻的元素做两两比较,哪个最大就后置,然后这样第二个元素就比第一个元素大,用同样的方法就保证了第三个元素又比第二个元素要大.不断重复这个过程, 最后一个元素肯定是最大的.这样,整个排序是两两比较,找出最大的,从大到小找出所有元素去排列,就就像

Alex Tam 的专栏 1084

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: 逻辑回归logistic regression
下一篇: matplotlib保存矢量图
SmartDemo
博客等级 码龄9年 176粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值