Sort方法学习(伪代码记录)

news/2025/9/17 20:24:52/文章来源:https://www.cnblogs.com/Foxg1ove/p/19097485

Sort 方法总结

selectionSort(vector& a)

核心思想:选择最大/小的数移到最前/后

// 1. 计算数组长度// 2. 控制已排序部分的边界
for(i=0; i<n; i++){// 3. 在未排序部分(j到末尾)中寻找真正的maxfor(j=i+1, j<n; j++) find(max);// 3. 将最大的数放至数组头swap(a[i],max);
} 

时间复杂度:(n-1) + (n-2) + ...... + 1 = n*(n-1)/2。O(n^2)

不稳定:

原数组[2a, 2b, 1]2a2b值相等,2a2b前),第一轮交换后:[1, 2b, 2a]

bubbleSort(vector& a)

核心思想:比较相邻元素,使较大的元素逐渐 "上浮" 到数组的队尾。

// 1. 计算数组长度// 2. 控制已排序部分边界
for(i=n-1; i>=0; i--){// 3. j在未排序的部分中遍历for(j=0; j<i; j++){// 4. 比较并且交换// 7 6 5 4 3 2 1	">": 最大的一定会在第一轮冒泡到队尾//				   "<":最小的一定会在第一轮冒泡到队尾if(a[j]>a[j+1])	swap(a[j],a[j+1]);}    
}

时间复杂度:(n-1) + (n-2) + ...... + 1 = n*(n-1)/2。O(n^2)

稳定:

相邻位置比较交换,且相等时不交换

insertionSort(vector& a)

核心思想:将数组分为 “已排序部分” 和 “未排序部分”,每次从无序列表中取一个元素,插入到有序列表的合适位置。

// 1. 计算数组长度// 2. i控制未排序数组边界
for(i=1; i<n; i++){// 3. j为已排序数组的元素x = a[j];		// x : 待插入元素int j;for(j=i-1; j>=0; j--){// 4. 从后往前依次将有序数组元素与待插入的元素进行比较if(x > a[j])	a[j+1] = a[j];	// 待插入>a[i],将有序数组的最后一个元素后移一位else 	break;  			   //  跳出循环}a[j] = x;
}

时间复杂度:(n-1) + (n-2) + ...... + 1 = n*(n-1)/2。O(n^2)

countingSort(vector& a, int m)

核心思想:将元素作为索引

时间复杂度:O(n+k)

空间复杂度:O(k)

为什么用 memset 而不是其他方式?

  • 效率更高:memset 是标准库函数,通常由汇编语言实现,对大块内存的初始化速度比手动循环(如 for (int i=0; i<=m; i++) count[i]=0)更快。

        int* count = new int[m + 1];memset(count, 0, sizeof(int) * (m + 1));
    
  • 简洁性:一行代码即可完成整个数组的初始化,无需编写循环逻辑。

mergeSort(vector& a, int l, int r)

核心思想:分治法。将无序数组一分为二,再分为四,直到无法再分割,然后将碎片的元素合并。

// 分治法
void mergeSort(vector<int>& a, int l, int r) {if (l >= r) {				//结束条件:无法再分割return;}int m = (l + r) / 2;		// 分:边界选择mergeSort(a, l, m);mergeSort(a, m + 1, r);merge(a, l, m, r);			// 合:两个有序数组合并
}void merge(vector<int>& a, int l, int m, int r){// 1. 计算分割后两个数组的长度n1 = m-l+1;n2 = r-m;// 2. 设置temp临时数组存放两个分开的有序数组for(i=0; i<n1; i++)	temp[i] = a[l+i];for(j=0; j<n2; j++)	temp[n1+j] = a[m+1+j]int i = 0, j = n1, k = l;// 3. 当n1=n2while(i<n1 && j<n1+n2){// 比较temp[i] temp[j],按序放入a[k]a[k++] = temp[i]<=temp[j]?temp[i++]:temp[j++];}    // 4. n1 > n2while(i<n1) a[k++] = temp[i++];// 5. n2 > n1while(j<n1+n2) a[k++] = temp[j++];// 6.删除中间数组delete[] temp; 
}

QuickSort(vetcot& a, int l, int r)

核心思想:分治法。选择一个基准元素,将数组分为两部分,一部分都比基准元素大,一部分都比基准元素小;然后再对这两部分分别快速排序。

void QuickSort(vector<int>& a, int l, int r)
{if(l >= r) return;// 选择基准元素int povix = Partion(a,l,r);QuickSort(a, l, pivox - 1);QuickSort(a, pivox + 1, r);
}
// a[idx] = 4;
// l           r
// 4 5 2 3 6 1 7
// i           j
//
// x = 4
int Partition(vector<int>& a, int l, int r){// 1. 随机选择一个基准元素int idx = l + rand() % (r-l+1);// 2. 将当前基准元素和数组首元素交换swap(a[l], a[idx]);// 3. 双指针交换元素int i=l, j=r;int x = a[i];while(i<j){while (i < j && a[j] > x)  		  // 防止右侧的元素都大于x,则 a[j] 访问越界j--;if (i < j)						// 如果右侧的元素都大于x,会移到i==j的位置,这时不应该交换swap(a[i], a[j]), ++i;while (i < j && a[i] < x)i++;if (i < j)swap(a[i], a[j]), --j;}return i;
} 

基数排序

堆排序

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

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

相关文章

深入解析:【每日一问】运算放大器与比较器有什么区别?

深入解析:【每日一问】运算放大器与比较器有什么区别?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", mon…

9.17支配对问题专题总结

概括 每次查询一定范围内的点组成的点对中的最优值,而通过一些分析去减少有用点对的数量,这样子的有用点对称为 支配对 T1策略是将 \(a_i\) 相同的序列取出来单独考虑 固定 \(b_i<b_j,i<j\) 然后考虑能找出来一个序列 \(i,j1,j2,j3...\) 但是发现选 \(i,j2\) 不如选 \(…

Xじゃないか

並行じゃないか いや 通信じゃないか わかりあえなくて 愛じゃないか ——絡みなんです それがAIなんです。\[\newcommand{\c}{\mathcal} \newcommand{\eps}{\epsilon} \newcommand{\co}[2]{{\color{#1}{#2}}} \]L…

开源收银体系_大型收银系统源码_OctShop

开源收银体系_大型收银系统源码_OctShoppre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

完整教程:热力图是什么?三分钟学会热力图数据分析怎么做!

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

机器视觉检测中光源的作用以及分类 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

XXL-JOB(2)

XXL-JOB(2)1、入门和集成<!-- xxl-job-core --><dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.5.0</version></dependency> 搭建控制台 XXL-JOB-ADMIN jar 本地启动,…

P9753 [CSP-S 2023] 消消乐

前置算法动态规划 hash哈希题目大意 给定一个字符串,可以将相邻两个相同的字符删除,然后合并成一个新序列。 例如:abba,可以先将两个 b 删除,然后合并成 aa,最后删除 a。 求出有多少个字串,最后可以将其变为空串,我们称之为合法的字串。 思路 看到数据范围,只能使用 \…

9.16 CSP-S模拟22 改题记录

HZOJ 写在前面 连着两天吃了两坨。。。好吧,那就一坨一坨地消化一下吧。话说如果这真是S组难度那我不真就废了?这场真是T1猜结论题,T2就来坨大的,不知道啥是二分图暴力都不会打。T3反正就是我是大春竹。T4上演忘记结论创造结论,然鹅实际上还是不会写。没有文件输入输,没有…

AT_agc058_b [AGC058B] Adjacent Chmax

转化为对某个区间染色,然后设 \(f_{i, j}\) 为前 \(i\) 种颜色染了 \([1, j]\) 的方案数,简单转移即可。

Jenkins CVE-2018-1000600漏洞利用与SSRF攻击分析

本文详细分析了Jenkins GitHub插件CVE-2018-1000600漏洞的利用方法,通过CSRF漏洞和权限缺失实现凭证窃取与完全响应SSRF攻击,包含PoC代码和影响版本范围说明。Jenkins - CVE-2018-1000600 PoC 来源博客文章 https://blog.orange.tw/2019/01/hacking-jenkins-part-1-play-with…

NOIP 集训日记(学术)

workwork学术版。 9.9 P4117 [Ynoi2018] 五彩斑斓的世界 分块神题。 拿到题以后发现不能直接做,然后你就开始观察。 设区间最大值为 \(maxn\) ,查询的数为 \(x\) 一个显然的性质:把所有小于等于 \(x\) 的数加上 \(x\) ,然后区间减 \(x\) ,得到的结果不变。然后我们思考一下…

linux中mysql如何远程连接

linux中mysql如何远程连接 两个步骤: 第一:让root允许远程登录 update user set host = % where user = root;第二:给予root用户最大数据库权限 grant all privileges on *.* to root@% identified by 123456; flush privileges;实操: [root@bogon ~]# mysql -uroot -p1234…

详细介绍:Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测

详细介绍:Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

深入解析:PYcharm——pyqt音乐播放器

深入解析:PYcharm——pyqt音乐播放器pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important…

威联通NAS如何导入本地docker镜像

威联通NAS如何导入本地docker镜像 【前言】:有一段时间没有维护NAS docker了,笔记本电脑坏了更换后重新配置开发环境,也就没去折腾这些,有些命令忘记了,重新整理一下,输出驱动输入,还可能帮助到。欢迎大家一起友好讨论, 祝好: 【摘要】:本文主要围绕威联通NAS如何导入…

基本数据类型题目

1、列表的操作可变的数据类型,增删改查等操作都可以进行1、案例1fruits=[苹果, 香蕉, 橙子, 葡萄, 西瓜]向列表中添加两种新水果:菠萝和芒果从列表中删除香蕉元素将列表中的橙子改为柑橘检查葡萄是否在列表中,并返回其索引fruits = [apple, banana, apple, orange, banana, …

2025.9.17

卷2选择 位运算 位运算的优先级很低,没有括号时运算顺序靠后。

mysql库缺失

mysql库缺失libncurses.so.5和libtinfo.so.5 报错信息: mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory;mysql: error while loading shared libraries: libtinfo.so.5: cannot open shared obj…