排序基础

排序方法分两大类,一类是比较排序,快速排序(Quick Sort)、归并排序(Merge Sort)、插入排序(Insertion Sort)、选择排序(Selection Sort)、希尔排序(Shell Sort)、堆排序(Heap Sort)等属于比较排序方法,比较排序方法理论最优时间复杂度是O(nlogn),各方法排序过程和原理见  可视化过程

另一类是非比较排序,被排序元素框定范围的前提下可使用非比较排序方法,例如桶排序(Bucket Sort)、计数排序(Counting Sort)等,时间复杂度可减少至O(n)。

比较排序方法

快速排序(Quick Sort) 快速选择(Quick Select)是快速排序的衍生引用,常用于求中位数、Kth数字。

相关LeetCode题:

973. K Closest Points to Origin  题解

插入排序(Insertion Sort) 

相关LeetCode题:

147. Insertion Sort List  题解

归并排序(Merge Sort) 有一项引申应用、计算数组的Inversions,即求数组中满足于a[i] > a[j] 且 i < j 这样条件的对数,详见 Count Inversions in an array | Set 1 (Using Merge Sort)

C++中提供了两个内置的归并排序方法:

merge(l1.begin(), l1.end(), l2.begin(), l2.end(), result.begin());//which stores the merged array in result

inplace_merge(l.begin(), l.middle, l.end());//where array [begin, middle) is merged with array [middle, end).

相关LeetCode题:

315. Count of Smaller Numbers After Self  题解

327. Count of Range Sum  题解

493. Reverse Pairs  题解

非比较排序方法

桶排序(Bucket Sort)  可视化过程,桶排序也有一些引申应用,例如 LeetCode题目 164. Maximum Gap 利用桶划分取值求两元素间隔最大值。

相关LeetCode题:

164. Maximum Gap  题解

计数排序(Counting Sort)  可视化过程

相关LeetCode题:

1122. Relative Sort Array  题解

1030. Matrix Cells in Distance Order  题解

排序的应用

实际应用中我们不从头实现排序函数、常直接调用库函数完成排序,如C++ STL中常用的sort、partial_sort等。

相关LeetCode题:

349. Intersection of Two Arrays  题解

350. Intersection of Two Arrays II  题解

1086. High Five  题解

976. Largest Perimeter Triangle  题解

56. Merge Intervals  题解

253. Meeting Rooms II  题解

57. Insert Interval  题解

527. Word Abbreviation  题解

179. Largest Number  题解

274. H-Index  题解

259. 3Sum Smaller  题解

非典型排序问题

一些问题要求按一定规则对序列进行排序,比如“奇偶奇偶……”奇数、偶数交叠,或 nums[0] <= nums[1] >= nums[2] <= nums[3]……,我称之为非典型排序问题。

这类问题不能用上述排序方法解决,更多是考量对数组元素排布的处理逻辑。

相关LeetCode题:

75. Sort Colors  题解

922. Sort Array By Parity II  题解

324. Wiggle Sort II  题解

1054. Distant Barcodes  题解

767. Reorganize String  题解

969. Pancake Sorting  题解

算法与数据结构基础 - 排序(Sort)的更多相关文章

  1. 算法与数据结构基础 - 分治法(Divide and Conquer)

    分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解.最终合并结果,分治法用伪代码表示如下: function f(input x size ...

  2. 算法与数据结构基础 - 贪心(Greedy)

    贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...

  3. 算法与数据结构基础 - 广度优先搜索(BFS)

    BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...

  4. 算法与数据结构基础 - 图(Graph)

    图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...

  5. 算法与数据结构基础 - 数组(Array)

    数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...

  6. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  7. 算法与数据结构基础 - 哈希表(Hash Table)

    Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...

  8. 算法与数据结构基础 - 双指针(Two Pointers)

    双指针基础 双指针(Two Pointers)是面对数组.链表结构的一种处理技巧.这里“指针”是泛指,不但包括通常意义上的指针,还包括索引.迭代器等可用于遍历的游标. 同方向指针 设定两个指针.从头往 ...

  9. 算法与数据结构基础 - 二叉树(Binary Tree)

    二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...

随机推荐

  1. k8s学习 - 概念 - master/node

    k8s学习 - 概念 - master/node 在k8s中,有各种各样的概念和术语.这些概念是必须要学习和掌握的.我们先罗列下所有概念,然后再一个个看具体实例. 大概说一下这些概念: Master: ...

  2. NetCore + Mysql CodeFirst 生成数据库

    首先定义领域的模型类,然后配置下面的一些东西,最后执行类 1. 新建Context 继承自 DbContext public class EFProjectContext : DbContext { ...

  3. Java学习笔记之---比较接口与抽象类

    Java学习笔记之---比较接口与抽象类 抽象类是描述事物的本质,接口是描述事物的功能 接口与抽象类的异同 1.一个类只能继承一个父类,但是可以有多个接口 2.抽象类中的抽象方法没有方法体,但是可以有 ...

  4. 17.Linux命令

    1.网络配置 setup       配置 ifup eth0  启动网卡 文件保存在  /etc/sysconfig/network-scripts/ifcfg-eth0,修改ifcfg-eth0配 ...

  5. signed char类型取值范围计算

    在C语言程序中,给定一个类型,如何计算这个类型变量的取值范围呢?比如有一个字符型变量定义如下: signed char c: 这个字符变量c的取值范围是[-128,127],是计算出来的呢? 假设字符 ...

  6. I/O:Reader

    FileReader: /* 用来读取字符文件的便捷类.此类的构造方法假定默认字符编码和默认字节缓冲区大 小都是适当的.要自己指定这些值,可以先在 FileInputStream 上构造一个 Inpu ...

  7. 单元测试jest部署

    引入jest需安装的基础插件: 基础插件 @babel/core 编译工具核心模块包 @babel/preset-env 编译工具,支持es2015特性的编译打包工具包 babel-jest 对.js ...

  8. 个人永久性免费-Excel催化剂功能第55波-Excel批注相关的批量删除作者、提取所有批注信息等

    Excel里的批注,许多人很喜欢用,但批注真的值得我们大量使用吗?批注的使用场景在哪里?这些问题可能更值得花时间来思考下.同样因为不规范地使用批注,也带出了一大堆的后续擦屁股的事情来,从批注中找回有价 ...

  9. Kafka工作流程分析

    Kafka工作流程分析 生产过程分析 写入方式 producer采用推(push)模式将消息发布到broker,每条消息都被追加(append)到分区(patition)中,属于顺序写磁盘(顺序写磁盘 ...

  10. [leetcode] 103 Binary Tree Zigzag Level Order Traversal (Medium)

    原题链接 题目要求以"Z"字型遍历二叉树,并存储在二维数组里. 利用BFS,对每一层进行遍历.对于每一层是从左还是从右,用一个整数型判断当前是偶数行还是奇数行就可以了. class ...