
排序
文章平均质量分 84
常见的排序算法总结及C++代码实现
Ypuyu
Ypuyu
展开
-
[排序] 快速排序、归并排序模板(模板)
文章目录0. 前言1. 快速排序2. 归并排序0. 前言正经人谁手写这玩意?1. 快速排序785. 快速排序本质: 分治。是不稳定的排序算法。时间复杂度:O(nlogn)O(nlogn)O(nlogn)空间复杂度:O(logn)O(logn)O(logn),基于递归,用到栈空间模板注意点:注意点就是不要随便改动里面的任何一个下标…快排边界情况很多很多,这是个经过千锤百炼的模板代码,理解算法思想后背过模板就行了基准值 int x = q[l+r>>1],写成 int x原创 2020-11-15 18:34:34 · 463 阅读 · 0 评论 -
[排序算法] 0. 专栏简介及各文章链接
排序算法排序算法是学习数据结构与算法知识中很重要的一环,自己在做 OJ 的时候,各种 sort() 函数用的不亦乐乎,但是真正让手撕一个快速排序却又拿不下来。那就在此进行一个学习总结吧,希望能够帮助到需要的同学,也是为开源社区做贡献了。排序算法CSND博客详解链接:排序基本概念:[排序算法] 1. 排序算法基本概念插入排序:直接插入排序二分插入排序希尔排序交换排序:冒泡排序快...原创 2020-02-17 17:53:36 · 223 阅读 · 0 评论 -
[排序] 逆序对的数量(模板+逆序对+归并应用)
文章目录0. 前言1. 归并应用+逆序对0. 前言经典问题。这个貌似在LeetCode 剑指 Offer 51. 数组中的逆序对是一道困难问题。1. 归并应用+逆序对788. 逆序对的数量逆序对这个求解,冒泡可以、归并可以、树状数组也可以。在这就总结一个归并版本。本质: 归并应用思路:完全基于归并排序先分治,二路归并数组单调不减在二路归并过程中若出现 q[i]>q[j],因为 i~mid 各个元素是不减的,所以 q[i+1 ~ mid] 就严格大于 q[j],均与 q[j] 构原创 2020-11-15 20:57:15 · 187 阅读 · 0 评论 -
[排序] 第k个数(模板+快速选择算法)
文章目录0. 前言1. 快速排序0. 前言快速选择算法的思想还是很厉害的。是快速排序的应用,一般将一次快排称为做了一次 partition 操作。c++ stl 也将该函数纳入其中,感兴趣可取查看相关 API。1. 快速排序786. 第k个数本质: 快排应用时间复杂度:O(n)O(n)O(n)空间复杂度:O(logn)O(logn)O(logn),基于递归,用到栈空间思路:一次快排,数轴左边都 <=x,数轴右边都 >= x左边的元素个数为 s = j - l + 1如果原创 2020-11-15 20:26:54 · 266 阅读 · 0 评论 -
[sort排序] 9. 抢气球(自定义排序、常规解法)
文章目录1. 题目来源2. 题目说明3. 题目解析方法一:sort()+自定义排序+常规解法1. 题目来源链接:抢气球2. 题目说明3. 题目解析方法一:sort()+自定义排序+常规解法这个题目读题半天,看了 case 就简单了。实际上就是将小朋友的身高排升序,气球高度排升序。让最低的小朋友去遍历拿气球,记录每个小朋友的拿气球个数即可,直至气球拿完或是高度度不足小朋友用完跳出。同...原创 2020-03-21 01:47:22 · 382 阅读 · 1 评论 -
[sort排序] 8. 成绩排序(自定义排序、宏定义、常规解法)
文章目录1. 题目来源2. 题目说明3. 题目解析方法一:sort()+自定义排序+常规解法1. 题目来源链接:成绩排序2. 题目说明3. 题目解析方法一:sort()+自定义排序+常规解法题意很明确,按照各科进行排序并输出对应的人名,最后按照总分排序输出人名即可。也是练习练习自定义排序和结构题吧。值得注意的是分数相同人名按照字典序进行输出。重复代码很多。参见代码如下:#incl...原创 2020-03-21 01:26:38 · 602 阅读 · 1 评论 -
[sort排序] 7. 交叉排序(自定义排序、常规解法)
文章目录1. 题目来源2. 题目说明3. 题目解析方法一:sort()+自定义排序+常规解法1. 题目来源链接:交叉排序2. 题目说明3. 题目解析方法一:sort()+自定义排序+常规解法题意很明确,就是一个区间段的排序,注意把握好边界即可。参见代码如下:#include <iostream>#include <algorithm>using na...原创 2020-03-21 01:17:42 · 496 阅读 · 0 评论 -
[sort排序] 6. 身高排序(升级版)(结构体、自定义排序、常规解法)
文章目录1. 题目来源2. 题目说明3. 题目解析方法一:sort()+结构体+自定义排序+常规解法1. 题目来源链接:身高排序(升级版)2. 题目说明3. 题目解析方法一:sort()+结构体+自定义排序+常规解法题意很明确,依旧采用结构体进行数据存储及排序,真的好方便…还有就是重复性的自定义排序码代码。参见代码如下:#include <iostream>#inc...原创 2020-03-21 01:08:58 · 1883 阅读 · 0 评论 -
[sort排序] 5. 分数线(桶排序、巧妙解法)
文章目录1. 题目来源2. 题目说明3. 题目解析方法一:桶排序+巧妙解法1. 题目来源链接:分数线2. 题目说明3. 题目解析方法一:桶排序+巧妙解法题意很明确,解法采用桶排序的思想,时间复杂度为 O(n)O(n)O(n) ,空间复杂度在此为 O(1)O(1)O(1)。参见代码如下:#include <iostream>using namespace std;...原创 2020-03-21 00:50:21 · 213 阅读 · 0 评论 -
[sort排序] 4. 获取姓名并排序(substr()、常规解法)
文章目录1. 题目来源2. 题目说明3. 题目解析方法一:sort()+substr()+常规解法1. 题目来源链接:获取姓名并排序2. 题目说明3. 题目解析方法一:sort()+substr()+常规解法题意很明确,就是将字符串前缀去掉并排序即可。就是一个简单的 substr() 应用。参见代码如下:#include <iostream>#include <...原创 2020-03-21 00:34:38 · 613 阅读 · 0 评论 -
[sort排序] 3. 评奖1(结构体、自定义排序、常规解法)
文章目录1. 题目来源2. 题目说明3. 题目解析方法一:sort()+结构体+自定义排序+常规解法1. 题目来源链接:评奖12. 题目说明3. 题目解析方法一:sort()+结构体+自定义排序+常规解法以前写了不少题,但是结构体真的很少很少使用,因为图方面的数据结构几乎没设计,唉还得恶补。在某些给出输入采用结构体真的非常合适。参见代码如下:#include <iostre...原创 2020-03-21 00:20:53 · 317 阅读 · 0 评论 -
[sort排序] 2. 前K名的平均数(自定义排序、lambada表达式、常规解法)
文章目录1. 题目来源2. 题目说明3. 题目解析方法一:sort()+自定义排序+常规解法方法二:greater< T >()+sort()+常规解法方法三:lambda表达式+sort()+常规解法1. 题目来源链接:前K名的平均数2. 题目说明3. 题目解析方法一:sort()+自定义排序+常规解法自定义从大到小排序练习。参见代码如下:#include <...原创 2020-03-20 23:48:01 · 426 阅读 · 0 评论 -
[sort排序] 1. 分数段统计
文章目录1. 题目来源2. 题目说明3. 题目解析方法一:空格处理+常规解法1. 题目来源链接:分数段统计2. 题目说明3. 题目解析方法一:空格处理+常规解法题目非常简单,做这个题是为了练习下 C 风格的题目,话说这当年要求输出用空格将输出的数字或字符串隔开这个问题,就是末尾加了个空格,难了我 10 几分钟没想到优秀的解法。现在回想起来也是满满的乐趣。参见代码如下:#inclu...原创 2020-03-20 23:30:15 · 280 阅读 · 1 评论 -
[排序算法] 13. 常见排序算法总结及运用高精度计时模板测试性能(复杂度分析、高精度计时、总结)
文章目录1. 基本思想2. 代码实现3. 性能分析1. 基本思想冒泡排序是交换排序的一种,所谓交换就是根据序列中两个数据的比较结果来对换这两个数据在序列中的位置,交换排序(递增)的特点是:将数据较大的记录向序列的尾部移动,数据较小的记录向序列的前部移动。冒泡排序很容易理解,如下图能很好解释冒泡排序的规则及排序过程:2. 代码实现// 冒泡排序(递增)void BubbleSort(i...原创 2020-02-19 14:35:42 · 482 阅读 · 0 评论 -
[排序算法] 12. 外排序基本概念及针对海量数据排序处理方法(海量数据、外排序)
文章目录1. 外排序的基本过程2. 海量数据的外排序2.1 位图2.2 MapReduce3. 常见题目解析1. 外排序的基本过程外排序的基本方法是归并排序法,它分为两个步骤:生成若干个初始归并段(顺串):将一个文件(含待排序的数据)中的数据分段读入内存,在内存中对其进行内排序,并将经过排序的数据段(有序段)写到多个外存文件上。多路归并:对这些初始归并段进行多遍归并,使得有序的归并段逐渐...原创 2020-02-19 01:46:42 · 840 阅读 · 0 评论 -
[排序算法] 11. 基数排序详解及采用一维数组实现优化(分配排序、算法优化、复杂度分析)
文章目录1. 基本思想2. 代码实现2.1 动态二维数组实现2.2 一维数组实现3. 性能分析3.1 链式队列性能分析3.2 一维数组实现1. 基本思想基数排序(radix sort)可以看作桶排序的扩展,它是一种多关键字排序算法。 如果记录安照多个关键字排序,则依次按照这些关键字进行排序。例如扑克牌排序,扑克牌由数字面直和花色两个关键字组成,可以先按照面值(2, 3,.,. 10, J,Q,...原创 2020-02-19 01:12:48 · 638 阅读 · 0 评论 -
[排序算法] 10. 桶排序及高精度计数器及随机数测试(分配排序)
文章目录1. 基本思想2. 代码实现3. 性能分析1. 基本思想分配排序不需要比较关键字的大小,根据关键字各位上的值,进行若干趟“分配”和“收集”实现排序。桶排序将待排序序列划分成若干个区间,每个区间形象的看作一个桶,如果桶中的记录多于一个则使用较快的排序方法进行排序,把每个同种的记录收集起来,最终得有序序列。这个排序方法真的很形象,速度还不慢,举个例子吧:假如有 10 个学生的成绩,(6...原创 2020-02-18 21:57:05 · 354 阅读 · 0 评论 -
[排序算法] 9. 归并排序递归与非递归实现及算法复杂度分析(分治算法、归并排序、复杂度分析)
文章目录1. 基本思想2. 代码实现2.1 递归实现2.2 优化---非递归实现3. 性能分析1. 基本思想在数列排序中,如果只有一个数,那么它本身就是有序的;如果只有两个数,那么一次比较就可以完成排序。也就是说,数越少,排序越容易。那么,如果有一个由大量数据组成的数列,我们很难快速地完成排序,该怎么办呢?可以考虑将其分解为很小的数列,直到只剩一个数时,本身已有序,再把这些有序的数列合并在一起...原创 2020-02-18 17:34:45 · 1298 阅读 · 1 评论 -
[排序算法] 8. 堆排序及模拟实现堆(选择排序,堆排序,向下调整)
文章目录1. 基本思想1.1 复习数据结构---堆1.2 堆的概念1.3 堆的性质1.4 堆的实现1.4.1 堆的AdjustDown向下调整算法1.4.2 堆的创建1.4.3 堆的插入与AdjustUp向下调整算法1.4.4 堆的删除1.4.5 堆排序1.4.6 模拟实现堆2. 代码实现3. 性能分析1. 基本思想堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法...原创 2020-02-18 15:43:11 · 881 阅读 · 0 评论 -
[排序算法] 7. 直接选择排序及优化、三次异或交换法暴露的坑点(选择排序、算法优化)
文章目录1. 基本思想2. 代码实现3. 性能分析1. 基本思想每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。主要步骤如下:在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换在剩余的array[i]–a...原创 2020-02-18 12:50:44 · 338 阅读 · 0 评论 -
[排序算法] 6. 快速排序多种递归、非递归实现及性能对比(交换排序)
文章目录1. 基本思想2. 代码实现2.1 基准值三数取中2.2 交换两值的经典方式2.3 hoare法区间划分方式2.4 挖坑法区间划分方式2.5 前后指针法区间划分方式2.5 快排主函数(递归实现)2.6 快排借用栈+循环的非递归实现3. 简单的实现快排4. 性能分析1. 基本思想快速排序是 Hoare 于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某...原创 2020-02-18 00:45:37 · 626 阅读 · 0 评论 -
[排序算法] 5. 冒泡排序(交换排序)
文章目录1. 基本思想2. 代码实现3. 性能分析1. 基本思想冒泡排序是交换排序的一种,所谓交换就是根据序列中两个数据的比较结果来对换这两个数据在序列中的位置,交换排序(递增)的特点是:将数据较大的记录向序列的尾部移动,数据较小的记录向序列的前部移动。冒泡排序很容易理解,如下图能很好解释冒泡排序的规则及排序过程:2. 代码实现// 冒泡排序(递增)void BubbleSort(i...原创 2020-02-18 00:45:13 · 497 阅读 · 0 评论 -
[排序算法] 4. 希尔排序(插入排序)
文章目录1. 基本思想2. 代码实现3. 性能分析1. 基本思想希尔排序法又称缩小增量法。希尔排序法的基本思想是:先取一个小于n的整数d1作为第一个增量,把数组的全部数据分组分组规则为所有距离为d1的倍数的数据放在同一个组中。先在各组内进行直接插入排序,变成有序序列然后,取第二个增量d2 < d1重复上述的分组和排序直至所取的增量 dt = 1( dt < dt-1 ,…...原创 2020-02-17 17:59:00 · 272 阅读 · 0 评论 -
[排序算法] 3. 二分插入排序(插入排序、二分查找)
文章目录1. 基本思想2. 代码实现3. 性能分析1. 基本思想直接插入排序时,前半段均为有序序列,但是查找方式顺序向前找,效率很低。而在有序序列中查找插入数的位置时采用二分法便可提高查找效率。 故可对直接插入排序进行如下改造即可。2. 代码实现// 二分插入排序(递增)void BinInsertSort(int array[], int size) { for (int i = 1...原创 2020-02-17 17:55:25 · 652 阅读 · 0 评论 -
[排序算法] 2. 直接插入排序(插入排序)
文章目录1. 基本思想2. 代码实现3. 性能分析1. 基本思想直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。可以类比平日打扑克的情况:当插入第 i(i>=1)个元素时,前面的 array[0]、array[1]…、array[i-1] 已经排好序,此时用 a...原创 2020-02-17 17:54:39 · 454 阅读 · 0 评论 -
[排序算法] 1. 排序算法基本概念
文章目录0. 前言1. 排序2. 排序稳定性3. 内排序4. 外排序0. 前言本文为排序算法的基本概念讲解,如:排序稳定性、内排序、外排序等专有名词,在后序排序博文中出现将不再做解释。1. 排序所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。2. 排序稳定性假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保...原创 2020-02-17 17:53:59 · 313 阅读 · 0 评论