C/C++算法从小白到高手(1):排序算法

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/623253.shtml

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

相关文章

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑风电出力不确定性的电网无功-电压控制鲁棒分区方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题涉及到考虑风电出力不确定性的电网无功-电压控制鲁棒分区方法。让我们逐步解读这个标题的主要关键词和概念&#xff1a; 考虑风电出力不确定性…

android,app,小程序页面布局的各种栏

手机页面从上到下通常包含以下几个栏&#xff1a; 1.状态栏&#xff08;Status Bar&#xff09;&#xff1a;位于屏幕的顶部&#xff0c;用于显示手机的系统状态信息&#xff0c;例如时间、电池电量、信号强度等。状态栏也可以包含一些通知图标和快捷设置图标。 2.标题栏&…

根据编码规则使用nodejs脚本来大批量生成星原物联网设备采集点表

在使用星原网关时&#xff0c;需要导入点表&#xff0c;由于设备的点表非常的多&#xff0c;可写的点表有1095个。 所有根据编码规律&#xff0c;编写了一段nodejs代码&#xff0c;来生成点表。 一个编码有四部分组成&#xff0c; 分别是 [‘A’, ‘B’, ‘C’, ‘D’, ‘E’]…

CTF伪随机数爆破

要了解伪随机数的爆破首先你的先知道什么是PHP种子&#xff0c; 借用在rand()函数中&#xff0c;我们可以通过设置随机数种子来影响随机数的生成。例如&#xff0c;在rand()函数中加入了随机数种子编码后&#xff0c;每次运行程序将会生成同样的随机整数序列。这个就是伪随机数…

第28关 k8s监控实战之Prometheus(八)

大家好&#xff0c;我是博哥爱运维。从这节课开始&#xff0c;博哥计划引入golang&#xff08;简称go&#xff09;语言开发的一些内容&#xff0c;没有接触过go语言的同学也不用慌&#xff0c;我会尽量以一个新人的角度&#xff0c;去把这些go开发的内容讲得通俗一些。这节课还…

布隆过滤器四种实现(Java,Guava,hutool,Redisson)

1.背景 为预防大量黑客故意发起非法的时间查询请求&#xff0c;造成缓存击穿&#xff0c;建议采用布隆过滤器的方法解决。布隆过滤器通过一个很长的二进制向量和一系列随机映射函数&#xff08;哈希函数&#xff09;来记录与识别某个数据是否在一个集合中。如果数据不在集合中…

计算机毕业设计 基于Java的国产动漫网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

polar CTF 写shell

一、题目 <?php /*PolarD&N CTF*/highlight_file(__FILE__);file_put_contents($_GET[filename],"<?php exit();".$_POST[content]);?>二、解题 payload ?filenamephp://filter/convert.base64-decode/resourceshell.php #<?eval($_POST[1]);…

Hadoop 实战 | 词频统计WordCount

词频统计 通过分析大量文本数据中的词频&#xff0c;可以识别常见词汇和短语&#xff0c;从而抽取文本的关键信息和概要&#xff0c;有助于识别文本中频繁出现的关键词&#xff0c;这对于理解文本内容和主题非常关键。同时&#xff0c;通过分析词在文本中的相对频率&#xff0…

Echarts折线图中数据根据正负数显示不同区域背景色-配置

示例 Echarts折线图中数据根据正负数显示不同区域背景色 Piecewise 分段类型Continuous 连续类型 Echarts配置 option {backgroundColor: "#030A41",xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun],axisTick: {show: false,},axisLabel: { /…

x-cmd pkg | jless - 受 Vim 启发的命令行 JSON 查看器

目录 简介首次用户功能特点类似工具与竞品进一步探索 简介 jless 是一个命令行 JSON 查看器&#xff0c;设计用于读取、探索和搜索 JSON 数据。可以使用它来替代 less 、 jq 、 cat 以及您当前用于查看 JSON 文件的编辑器的任何组合。它是用 Rust 编写的&#xff0c;可以作为单…

DNS记录类型介绍(A记录、MX记录、NS记录等)

简介&#xff1a; DNS A记录 NS记录 MX记录 CNAME记录 TXT记录 TTL值 PTR值建站名词解释&#xff1a;DNS A记录 NS记录 MX记录 CNAME记录 TXT记录 TTL值 PTR值 泛域名 泛解析 域名绑定 域名转向 1.DNS&#xff1a;Domain Name System 域名管理系统 域名是由圆点分开一串单词或缩…

启动SpringBoot报错:No more pattern data allowed after {*...} or ** pattern element

报错信息 [AbstractApplicationContext.java:592] → [Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name viewControllerHandlerMapping defin…

C#属性(Property)

文章目录 一、C#属性&#xff08;Property&#xff09;&#xff1f;二、属性的用法总结 一、C#属性&#xff08;Property&#xff09;&#xff1f; C#属性&#xff08;Property&#xff09;是一种访问器&#xff08;accessor&#xff09;&#xff0c;用于封装一个类的字段&…

Dijsktra算法理解笔记

Dijsktra算法理解笔记 学习了柳神的笔记 感谢柳神 Dijkstra算法是处理图问题中的最短路径的问题 最短路径问题可以大致分为两个方向 单源最短路径全局最短路径 以此为基准可以将最短路径算法这样划分&#xff1a; 单源最短路径 Dijkstra &#xff1a;不能求负权边Bellman-F…

es6导入导出语法,vue-router简单使用,登录跳转案例,scoped的使用

es6导入导出语法 默认导出和导入 导出语法 只导出变量&#xff1a;export default name 只导出函数&#xff1a;export default add 导出对象&#xff1a;export default {name,add} export default { name:"彭于晏", add: (a,b)>{ return …

力扣83-删除排序链表中的重复元素

删除排序链表中的重复元素 题目链接 解题思路 1.遍历整个链表&#xff0c;遇见重复元素&#xff0c;直接删除即可 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNod…

BC19 反向输出一个四位数

描述 将一个四位数&#xff0c;反向输出。 输入描述&#xff1a; 一行&#xff0c;输入一个整数n&#xff08;1000 < n < 9999&#xff09;。 输出描述&#xff1a; 针对每组输入&#xff0c;反向输出对应四位数。 示例1 输入&#xff1a; 1234 复制输出&#xf…

vcs makefile

主要参考&#xff1a; VCS使用Makefile教程_vcs makefile-CSDN博客https://blog.csdn.net/weixin_45243340/article/details/129255218?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170524049516800227431373%2522%252C%2522scm%2522%253A%252220140713.1301023…

计算机组成原理重点简答题

文章目录&#xff08;持续更新&#xff09; 计算机组成原理重点简答题&#x1f4e3;一、谈一谈对指令寄存器IR的认识&#xff1f;&#x1f4e3;二、存储器的特征和功能&#xff1f;&#x1f4e3;三、冯诺依曼计算机体系结构&#xff1f; 计算机组成原理重点简答题 &#x1f4e…