摘要: 堆 堆的一个经典的实现是完全二叉树(complete binary tree),这样实现的堆称为二叉堆(binary heap)。 这里来说明一下满二叉树的概念与完全二叉树的概念。 满二叉树:除了叶子节点,所有的节点的左右孩子都不为空,就是一棵满二叉树,如下图。 可以看出:满二叉树所有的节点都拥有左 阅读全文
posted @ 2022-03-01 16:02 Logan_Xu 阅读(36) 评论(0) 推荐(0) 编辑
摘要: 基数排序 基数排序是一种非比较型整数排序算法,其原理是将数据按位数切割成不同的数字,然后按每个位数分别比较。 假设说,我们要对 100 万个手机号码进行排序,应该选择什么排序算法呢?排的快的有归并、快排时间复杂度是 \(O(n \log n)\),计数排序和桶排序虽然更快一些,但是手机号码位数是11 阅读全文
posted @ 2022-03-01 15:51 Logan_Xu 阅读(45) 评论(0) 推荐(0) 编辑
摘要: 桶排序 桶排序可以看成是计数排序的升级版,它将要排的数据分到多个有序的桶里,每个桶里的数据再单独排序,再把每个桶的数据依次取出,即可完成排序。 我们拿一组计数排序啃不掉的数据 [ 500,6123,1700,10,9999 ] 来举例。 第一步,我们创建 10 个桶,分别来装 0-1000 、100 阅读全文
posted @ 2022-03-01 15:40 Logan_Xu 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 计数排序 计数排序是一种非基于比较的排序算法,我们之前介绍的各种排序算法几乎都是基于元素之间的比较来进行排序的,计数排序的时间复杂度为 \(O(n + m)\),m 指的是数据量,说的简单点,计数排序算法的时间复杂度约等于 \(O(n)\),快于任何比较型的排序算法。 以下以[ 3,5,8,2,5, 阅读全文
posted @ 2022-03-01 15:21 Logan_Xu 阅读(116) 评论(0) 推荐(0) 编辑
摘要: 堆排序 顾名思义,是利用堆这种数据结构来进行排序的算法。 如果你了解堆这种数据结构,你应该知道堆是一种优先队列,两种实现,最大堆和最小堆,由于我们这里排序按升序排,所以就直接以最大堆来说吧。 我们完全可以把堆(以下全都默认为最大堆)看成一棵完全二叉树,但是位于堆顶的元素总是整棵树的最大值,每个子节点 阅读全文
posted @ 2022-03-01 14:27 Logan_Xu 阅读(52) 评论(0) 推荐(0) 编辑
摘要: 快速排序 快速排序的核心思想也是分治法,分而治之。它的实现方式是每次从序列中选出一个基准值,其他数依次和基准值做比较,比基准值大的放右边,比基准值小的放左边,然后再对左边和右边的两组数分别选出一个基准值,进行同样的比较移动,重复步骤,直到最后都变成单个元素,整个数组就成了有序的序列。 我们以[ 8, 阅读全文
posted @ 2022-03-01 14:06 Logan_Xu 阅读(75) 评论(0) 推荐(0) 编辑
摘要: 归并排序 归并字面上的意思是合并,归并算法的核心思想是分治法,就是将一个数组一刀切两半,递归切,直到切成单个元素,然后重新组装合并,单个元素合并成小数组,两个小数组合并成大数组,直到最终合并完成,排序完毕。 我们以[ 8,2,5,9,7 ]这组数字来举例 首先,一刀切两半: 再切: 再切: 粒度切到 阅读全文
posted @ 2022-03-01 11:24 Logan_Xu 阅读(42) 评论(0) 推荐(0) 编辑