C++排序算法概览

1. 冒泡排序

(1) 基本思路

冒泡排序是一种简单的、但效率极低的排序算法,基本思路是重复地遍历待排序的序列,通过相邻元素的比较和交换,将较大(或较小)的元素逐步"冒泡"到右侧(或左侧),直到整个序列有序为止。

(2) 升序排序
BUBBLE-SORT(a, len)for i = 1 ~ len-2dofor j = 1 ~ len-i-2doif a[j] > a[j+1]doswap(a[j], a[j+1]);end ifend forend for
(3) 分析时间复杂度
程序执行次数(化简后)时间复杂度
for i = 1 ~ len-2 l e n − 2 len-2 len2 O ( l e n ) O(len) O(len)
for j = 1 ~ len-i-2 ( l e n − 1 ) ⋅ ( l e n − 2 ) 2 \frac{{(len-1) \cdot (len-2)}}{2} 2(len1)(len2) O ( l e n 2 ) O(len^2) O(len2)
if a[j] > a[j+1] ( l e n − 1 ) ⋅ ( l e n − 2 ) 2 \frac{{(len-1) \cdot (len-2)}}{2} 2(len1)(len2) O ( l e n 2 ) O(len^2) O(len2)
swap(a[j], a[j+1]) ( l e n − 1 ) ⋅ ( l e n − 2 ) 2 \frac{{(len-1) \cdot (len-2)}}{2} 2(len1)(len2) O ( l e n 2 ) O(len^2) O(len2)
BUBBLE-SORT 3 l e n 2 − 9 l e n + 10 2 ⋅ ( l e n − 2 ) \frac{{3len^2 - 9len + 10}}{2} \cdot (len-2) 23len29len+10(len2) O ( l e n 3 ) O(len^3) O(len3)

所以,冒泡排序的时间复杂度一般在 O ( n 3 ) O(n^3) O(n3) 上下。即使时间复杂度很高,但是冒泡排序还是有很高的地位。它既简单,又容易实现。

2. 插入排序

(1) 基本思路

插入排序是一种简单直观的排序算法,基本思路是将一个待排序的元素插入到已经排好序的子序列中的适当位置,直到整个序列有序为止。

(2) 升序排序
INSERTION-SORT(a, len)for i = 1 ~ len-1dokey = a[i]j = i - 1while j >= 0 and a[j] > keydoa[j+1] = a[j]j = j - 1end whilea[j+1] = keyend for
(3) 分析时间复杂度
程序执行次数(化简后)时间复杂度
for i = 1 ~ len-1 l e n − 1 len-1 len1 O ( l e n ) O(len) O(len)
while j >= 0 and a[j] > key ( l e n − 1 ) ⋅ ( l e n − 2 ) 2 \frac{{(len-1) \cdot (len-2)}}{2} 2(len1)(len2) O ( l e n 2 ) O(len^2) O(len2)
a[j+1] = a[j] ( l e n − 1 ) ⋅ ( l e n − 2 ) 2 \frac{{(len-1) \cdot (len-2)}}{2} 2(len1)(len2) O ( l e n 2 ) O(len^2) O(len2)
a[j+1] = key l e n − 1 len-1 len1 O ( l e n ) O(len) O(len)
INSERTION-SORT 3 l e n 2 − 3 l e n + 4 2 \frac{{3len^2 - 3len + 4}}{2} 23len23len+4 O ( l e n 2 ) O(len^2) O(len2)

所以,插入排序的时间复杂度一般在 O ( n 2 ) O(n^2) O(n2) 上下。它的时间复杂度比冒泡排序低,是一种简单且常用的排序算法。

3. 选择排序

(1) 基本思路

选择排序是一种简单直观的排序算法,基本思路是找到待排序序列中的最小(或最大)元素,将它与序列的第一个位置进行交换,然后再在剩余的序列中找到最小(或最大)元素,将它与序列的第二个位置进行交换,以此类推,直到整个序列有序为止。

(2) 升序排序
SELECTION-SORT(a, len)for i = 1 ~ len-1dominIndex = ifor j = i+1 ~ lendoif a[j] < a[minIndex]dominIndex = jend ifend forswap(a[i], a[minIndex])end for
(3) 分析时间复杂度
程序执行次数(化简后)时间复杂度
for i = 1 ~ len-1 l e n − 1 len-1 len1 O ( l e n ) O(len) O(len)
for j = i+1 ~ len ( l e n − 1 ) ⋅ l e n 2 \frac{{(len-1) \cdot len}}{2} 2(len1)len O ( l e n 2 ) O(len^2) O(len2)
if a[j] < a[minIndex] ( l e n − 1 ) ⋅ l e n 2 \frac{{(len-1) \cdot len}}{2} 2(len1)len O ( l e n 2 ) O(len^2) O(len2)
swap(a[i], a[minIndex]) l e n − 1 len-1 len1 O ( l e n ) O(len) O(len)
SELECTION-SORT 3 l e n 2 − 3 l e n + 4 2 \frac{{3len^2 - 3len + 4}}{2} 23len23len+4 O ( l e n 2 ) O(len^2) O(len2)

所以,选择排序的时间复杂度一般在 O ( n 2 ) O(n^2) O(n2) 上下。虽然时间复杂度较高,但选择排序在某些情况下可以比其他排序算法更高效。

4. 快速排序

(1) 基本思路

快速排序是一种高效的排序算法,基本思路是通过一趟排序将待排序序列分割成独立的两个部分,其中一部分的所有元素都比另一部分的任意元素小,然后再对这两部分继续进行排序,直到整个序列有序为止。

(2) 升序排序
QUICK-SORT(a, low, high)if low < highdopivotIndex = PARTITION(a, low, high)QUICK-SORT(a, low, pivotIndex-1)QUICK-SORT(a, pivotIndex+1, high)end ifPARTITION(a, low, high)pivotValue = a[high]i = low - 1for j = low ~ high-1doif a[j] <= pivotValuedoi = i + 1swap(a[i], a[j])end ifend forswap(a[i+1], a[high])return i + 1
(3) 分析时间复杂度
程序执行次数(化简后)时间复杂度
if low < high log ⁡ 2 ( l e n ) \log_2(len) log2(len) O ( log ⁡ ( l e n ) ) O(\log(len)) O(log(len))
PARTITION(a, low, high) l e n − 1 len-1 len1 O ( l e n ) O(len) O(len)
QUICK-SORT(a, low, pivotIndex-1) l e n 2 − l e n 2 \frac{{len^2 - len}}{2} 2len2len O ( l e n 2 ) O(len^2) O(len2)
QUICK-SORT(a, pivotIndex+1, high) l e n 2 − l e n 2 \frac{{len^2 - len}}{2} 2len2len O ( l e n 2 ) O(len^2) O(len2)
QUICK-SORT 3 l e n 2 − 3 l e n + 10 2 \frac{{3len^2 - 3len + 10}}{2} 23len23len+10 O ( l e n 2 ) O(len^2) O(len2)
PARTITION l e n − 1 len-1 len1 O ( l e n ) O(len) O(len)

所以,快速排序的时间复杂度一般在 O ( n 2 ) O(n^2) O(n2) 上下,但在平均情况下,时间复杂度为 O ( n log ⁡ n ) O(n \log n) O(nlogn)

5. 归并排序

(1) 基本思路

归并排序是一种高效的排序算法,基本思路是将待排序序列分成若干个子序列,分别进行排序,然后再将已排序的子序列合并成更大的有序序列,直到最终只有一个有序序列为止。

(2) 升序排序
MERGE-SORT(a, low, high)if low < highdomid = (low + high) / 2MERGE-SORT(a, low, mid)MERGE-SORT(a, mid+1, high)MERGE(a, low, mid, high)end ifMERGE(a, low, mid, high)n1 = mid - low + 1n2 = high - midleft = new Array[n1]right = new Array[n2]for i = 0 ~ n1-1doleft[i] = a[low + i]end forfor j = 0 ~ n2-1doright[j] = a[mid + 1 + j]end fori = 0j = 0k = lowwhile i < n1 and j < n2doif left[i] <= right[j]doa[k] = left[i]i = i + 1elsea[k] = right[j]j = j + 1end ifk = k + 1end whilewhile i < n1doa[k] = left[i]i = i + 1k = k + 1end whilewhile j < n2doa[k] = right[j]j = j + 1k = k + 1end while
(3) 分析时间复杂度
程序执行次数(化简后)时间复杂度
if low < high log ⁡ 2 ( l e n ) \log_2(len) log2(len) O ( log ⁡ ( l e n ) ) O(\log(len)) O(log(len))
MERGE-SORT(a, low, mid) l e n ⋅ ( log ⁡ ( l e n ) − 1 ) 2 \frac{{len \cdot (\log(len) - 1)}}{2} 2len(log(len)1) O ( l e n log ⁡ ( l e n ) ) O(len \log(len)) O(lenlog(len))
MERGE-SORT(a, mid+1, high) l e n ⋅ ( log ⁡ ( l e n ) − 1 ) 2 \frac{{len \cdot (\log(len) - 1)}}{2} 2len(log(len)1) O ( l e n log ⁡ ( l e n ) ) O(len \log(len)) O(lenlog(len))
MERGE(a, low, mid, high) l e n − 1 len-1 len1 O ( l e n ) O(len) O(len)
MERGE-SORT 3 l e n ⋅ ( log ⁡ ( l e n ) − 1 ) 2 \frac{{3len \cdot (\log(len) - 1)}}{2} 23len(log(len)1) O ( l e n log ⁡ ( l e n ) ) O(len \log(len)) O(lenlog(len))
MERGE l e n − 1 len-1 len1 O ( l e n ) O(len) O(len)

所以,归并排序的时间复杂度一般为 O ( n log ⁡ n ) O(n \log n) O(nlogn),在任何情况下都具有稳定的性能。

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

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

相关文章

Qat++,轻量级开源C++ Web框架

目录 一.简介 二.编译Oat 1.环境 2.编译/安装 三.试用 1.创建一个 CMake 项目 2.自定义客户端请求响应 3.将请求Router到服务器 4.用浏览器验证 一.简介 Oat是一个面向C的现代Web框架 官网地址&#xff1a;https://oatpp.io github地址&#xff1a;https://github.co…

[网络安全]DHCP 部署与安全

一 、DHCP作用 (Dynamic HOst Configure Protocol ) 动态IP配置协议 作用:动态自动分配IP地址 二、DHCP相关概念 地址池/作用域: (IP、子网掩码、网关、DNS、周期) 三、DHCP优点 减少工程量 避免IP避免 提高地址利用率 四、DHCP原理 成为DHCP租约过程 步骤: 1.发送 DHC…

13.Kubernetes部署Go应用完整流程:从Dockerfile到Ingress发布完整流程

本文以一个简单的Go应用Demo来演示Kubernetes应用部署的完整流程 1、Dockerfile多阶段构建 Dockerfile多阶段构建 [root@docker github]# git clone https://gitee.com/yxydde/http-dump.git [root@docker github]# cd http-dump/ [root@docker http-dump]# cat Dockerfile …

15个为你的品牌增加曝光的维基百科推广方法-华媒舍

维基百科是全球最大的免费在线百科全书&#xff0c;拥有庞大的用户群体和高质量的内容。在如今竞争激烈的市场中&#xff0c;利用维基百科推广品牌和增加曝光度已成为许多企业的重要策略。本文将介绍15种方法&#xff0c;帮助你有效地利用维基百科推广品牌&#xff0c;提升曝光…

八. 实战:CUDA-BEVFusion部署分析-学习spconv的优化方案(Explicit GEMM conv)

目录 前言0. 简述1. 什么是Explicit GEMM Conv2. im2col3. spconv是如何使用Explicit GEMM Conv的4. 使用Explicit GEMM Conv处理spconv的优缺点5. 拓展-conv加速5.1 Introduction5.2 im2col5.3 Forward graph5.4 Backward graph5.5 Python example for forward propagation5.6…

Java数据结构与算法

0.数据机构和算法架构图 1.第一章 数据结构与算法介绍 2.第二章 数据结构与算法概述 3.第三章 稀疏数组和队列 4.第四章 链表 5.第五章 栈 6.第六章 递归 7.第七章 排序算法 8.第八章 查找算法 9.第九章 哈希表 10.第十章 树结构基础部分 11.第十一章 树结构实际应用…

工智能基础知识总结--深度学习中的优化方法

深度学习中的优化问题通常指的是:寻找神经网络上的一组参数 θ \theta θ,它能显著地降低代价函数 J ( θ ) J(\theta) J(θ

【Proteus仿真】【Arduino单片机】智能感应温控风扇

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用LCD1602液晶显示模块、DS18B20温度、按键、声光报警、L293D电机驱动等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示传感器检…

高级JavaScript。同步和异步,阻塞和非阻塞

同步阻塞 同步非阻塞 异步阻塞 异步非阻塞 在当什么是同步和异步&#xff0c;阻塞与非阻塞的概念还没弄清楚之前&#xff0c;更别提上面这些组合术语了&#xff0c;只会让你更加困惑。 同步和异步 同步和异步其实指的是&#xff0c;请求发起方对消息结果的获取是主动发起…

[BUG] Edge出现 0x80190001

前言&#xff1a; 我在登录edge微软账户的时候&#xff0c;出现了 解决&#xff1a; 关闭wifi的ipv6&#xff0c;然后断开wifi&#xff0c;重新连接

uniCloud - 云函数 的基本使用

目录 基本概念 简介 快速上手 1.新建云函数 2.使用云函数 callFunction方法 云函数的入参 获取云函数调用来源 云函数的返回格式 uniCloud响应体规范 总结案例 新建云函数 使用云函数 展示 基本概念 云函数即在云端&#xff08;服务器端&#xff09;运行的函数。…

SpringFramework实战指南(二)

SpringFramework实战指南&#xff08;二&#xff09; 2.1 Spring 和 SpringFramework概念2.2 SpringFramework主要功能模块2.3 SpringFramework 主要优势 2.1 Spring 和 SpringFramework概念 Spring-ioc 广义的 Spring&#xff1a;Spring 技术栈&#xff08;全家桶&#xff0…

odoo17基础培训1-odoo开发基础知识准备以及odoo17开发环境安装

odoo17基础培训 一、odoo开发基础知识准备以及odoo17开发环境安装 1、odoo是什么&#xff1f; 当我介绍客户使用odoo系统作为业务管理平台时&#xff0c;有时会被问到Odoo是什么&#xff1f; 简单点&#xff0c;可以这么说&#xff1a; Odoo是一套完整的系统&#xff0c;是…

ssm基于web的电影购票系统+vue论文

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统电影购票信息管理难度大&#xff0c;容错率低&#xff0c…

使用 C++/WinRT 的集合

在内部&#xff0c;Windows 运行时集合具有大量复杂的移动部件。 但要将集合对象传递到 Windows 运行时函数&#xff0c;或要实现自己的集合属性和集合类型时&#xff0c;C/WinRT 中有函数和基类可以提供支持。 这些功能消除复杂性&#xff0c;并节省大量时间和精力上的开销。 …

指定GPU无效

今天在进行模型训练的时候遇到这样一个问题&#xff1a;我想要模型在第1块显卡上进行训练&#xff0c;但是不论怎么指定GPU&#xff0c;模型始终是在第0块显卡上进行训练&#xff0c;很是不理解为什么这样&#xff1f; 经过查找资料&#xff0c;发现一个问题&#xff1a;如果在…

Python基础知识:整理14 利用pyecharts生成地图

1 地图可视化的基本使用 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts # 准备地图对象 map Map()# 准备数据 data [("北京市", 8), ("上海市", 99), ("广州省", 199), ("重庆市", 400), ("…

在FFmpeg源码下增加自定义程序

为了了解FFmpeg解码的细节&#xff0c;使用avcodec_send_packet和avcodec_receive_frame组合&#xff0c;写了一个简单的例子&#xff0c;解码video生成yuv文件&#xff0c;比起用FFmpeg跟踪代码要简单很多。 但是问题是在FFmpeg下编译的ffmpeg/ffplay都可以直接跟踪调试&…

什么是RESTful接口风格

开头语&#xff1a; 大家好&#xff01;欢迎来到本篇博客&#xff0c;今天我们将深入讨论RESTful接口风格。RESTful是一种设计风格&#xff0c;用于构建可扩展、可维护的网络服务。本文将为您介绍RESTful的基本概念、设计原则以及实际应用中的一些技巧。 RESTful接口风格分享&…

el-popover设置 :visible 手动关闭弹窗后,无法点击空白处关闭弹窗。

<script setup lang"ts"> import { ref, unref } from "vue"; import { ClickOutside as vClickOutside } from "element-plus";const popoverShow ref(false); //是否显示 const popoverRef ref();/**点击空白处隐藏 */ const onClickO…